ã²ãŒã éçºã§ã¯ãäœããã©ã³ãã æ§ãšçµã³ä»ããå¿
èŠãããããšããããããŸããUnity ã«ã¯ãã®ããã®ç¬èªã® Random ãããããããšäžŠè¡ã㊠System.Random ããããŸãã ãã€ãŠããããããžã§ã¯ãã§ãäž¡æ¹ãç°ãªãåäœãããå¯èœæ§ããããšããå°è±¡ãåããŸãã (ãã ãããããã¯åçã«åæ£ãããŠããã¯ãã§ã)ã
ãã®åŸã圌ãã¯è©³çŽ°ã«ã¯ç«ã¡å
¥ããŸããã§ãããSystem.Random ãžã®ç§»è¡ã«ãã£ãŠãã¹ãŠã®åé¡ãä¿®æ£ãããã ãã§ååã§ããã ããã§ãRNG ãã©ã®çšåºŠãåã£ãŠããããããŸãã¯äºæž¬å¯èœãããããŠã©ããéžæãã¹ããã«ã€ããŠãããã«è©³çŽ°ã«èª¿ã¹ãŠå°ã調æ»ãè¡ãããšã«ããŸããã ããã«ãç§ã¯åœŒãã®ãæ£çŽããã«ã€ããŠçžåããæèŠãäœåºŠãèããããšããããŸããå®éã®çµæã宣èšãããçµæãšã©ã®ããã«æ¯èŒãããããç解ããŠã¿ãŸãããã
ç°¡åãªæè²ããã°ã©ã ãŸã㯠RNG ã¯å®éã«ã¯ RNG ã§ã
ãã§ã«ä¹±æ°çºçåšã«ç²ŸéããŠããå Žåã¯ãããã«ããã¹ããã»ã¯ã·ã§ã³ã«é²ãã§ãã ããã
ä¹±æ° (RN) ã¯ãäœããã®ã©ã³ãã (ã«ãªã¹) ããã»ã¹ã䜿çšããŠçæãããäžé£ã®æ°å€ã§ããããšã³ããããŒã®æºã§ãã ã€ãŸããããã¯èŠçŽ ãæ°åŠçæ³åã«ãã£ãŠçžäºæ¥ç¶ãããŠããªãã·ãŒã±ã³ã¹ã§ãããå æé¢ä¿ã¯ãããŸããã
ä¹±æ°ãçæãããã®ãä¹±æ°çºçåš (RNG) ãšåŒã³ãŸãã ãã¹ãŠãåæ©çãªããšã®ããã«æããŸãããçè«ããå®è·µã«ç§»è¡ãããšãå®éã«ã¯ããã®ãããªã·ãŒã±ã³ã¹ãçæãããœãããŠã§ã¢ ã¢ã«ãŽãªãºã ãå®è£ ããã®ã¯ããã»ã©ç°¡åã§ã¯ãããŸããã
ãã®çç±ã¯ãçŸä»£ã®å®¶åºçšé»å補åã«ã¯åããããªæ··ä¹±ãååšããªãããšã«ãããŸãã ããããªããšãä¹±æ°ã¯ã©ã³ãã ã§ã¯ãªããªããä¹±æ°ã®ãžã§ãã¬ãŒã¿ãŒã¯ãæããã«å®çŸ©ãããåŒæ°ã®éåžžã®é¢æ°ã«å€ãããŸãã IT åéã®å€ãã®å°éåéã«ãšã£ãŠãããã¯æ·±å»ãªåé¡ (æå·åãªã©) ã§ãããä»ã®å°éåéã«ãšã£ãŠã¯å®å šã«èš±å®¹ã§ãã解決çããããŸãã
çã®ä¹±æ°ã§ã¯ãªããã®ã®ãã§ããã ãä¹±æ°ã«è¿ãå€ãããããæ¬äŒŒä¹±æ° (PRN) ãè¿ãã¢ã«ãŽãªãºã ãäœæããå¿ èŠããããŸãã ãã®å Žåã®ã¢ã«ãŽãªãºã ã¯æ¬äŒŒä¹±æ°çæåš (PRNG) ãšåŒã°ããŸãã
PRNG ãäœæããã«ã¯ããã€ãã®ãªãã·ã§ã³ããããŸããã以äžã¯ãã¹ãŠã®äººã«é¢ä¿ããŸãã
- äºåçãªåæåã®å¿
èŠæ§ã
PRNG ã«ã¯ãšã³ããããŒã®ãœãŒã¹ããªãããã䜿çšããåã«åæç¶æ ãäžããå¿ èŠããããŸãã ããã¯æ°å€ (ãŸãã¯ãã¯ãã«) ãšããŠæå®ãããã·ãŒã (ã©ã³ãã ã·ãŒã) ãšåŒã°ããŸãã å€ãã®å Žåãããã»ããµ ã¯ãã㯠ã«ãŠã³ã¿ãŒããŸãã¯ã·ã¹ãã æéã«çžåœããæ°å€ãã·ãŒããšããŠäœ¿çšãããŸãã
- ã·ãŒã±ã³ã¹ã®åçŸæ§ã
PRNG ã¯å®å šã«æ±ºå®çã§ãããããåæåäžã«æå®ãããã·ãŒãã«ãã£ãŠãå°æ¥ã®æ°å€ã·ãŒã±ã³ã¹å šäœãäžæã«æ±ºå®ãããŸãã ããã¯ãåãã·ãŒãã§åæåãããå¥ã® PRNG (ç°ãªãæéãç°ãªãããã°ã©ã ãç°ãªãããã€ã¹äž) ãåãã·ãŒã±ã³ã¹ãçæããããšãæå³ããŸãã
ãŸããPRNG ãç¹åŸŽä»ãã確çååžãã€ãŸã PRNG ãã©ã®ãããªæ°å€ãã©ã®ãããªç¢ºçã§çæããããç¥ãå¿
èŠããããŸãã ã»ãšãã©ã®å Žåãããã¯æ£èŠååžãŸãã¯äžæ§ååžã®ããããã§ãã
æ£èŠååžïŒå·ŠïŒãšäžæ§ååžïŒå³ïŒ
24 é¢ã®å ¬å¹³ãªãµã€ã³ãããããšããŸãã ãããæããå Žåã1 ãåŸããã確ç㯠24/XNUMX ã«çãããªããŸã (ä»ã®æ°åãåŸããã確çãšåã)ã äœåºŠãæããŠçµæãèšé²ãããšããã¹ãŠã®ãšããžãã»ãŒåãé »åºŠã§è±èœããããšãããããŸãã åºæ¬çã«ããã®ãã€ã¯åäžãªååžãæ〠RNG ãšèããããšãã§ããŸãã
ãããã®ãµã€ã³ããäžåºŠã« 10 åæããŠãåèšç¹ãæ°ãããã©ããªãã§ãããã?åäžæ§ã¯ä¿ãããã®ã§ããããïŒããããã»ãšãã©ã®å Žåããã®é㯠125 ãã€ã³ããã€ãŸãå¹³åå€ã«è¿ããªããŸãããã®çµæãæããåã§ããå°æ¥ã®çµæã倧ãŸãã«èŠç©ããããšãã§ããŸãã
ãã®çç±ã¯ãå¹³åã¹ã³ã¢ãååŸããããã®çµã¿åãããæãå€ããªãããã§ãã ããããé ãããã»ã©ãçµã¿åããã¯å°ãªããªããããã«å¿ããŠæ倱ã®å¯èœæ§ãäœããªããŸãã ãã®ããŒã¿ãèŠèŠåãããšããªããšãªãéã®åœ¢ã«äŒŒãŠããŸãã ãããã£ãŠãããçšåºŠã®ã¹ãã¬ãããããã°ã10 åã®ãµã€ã³ããããªãã·ã¹ãã ãæ£èŠååžã® RNG ãšåŒã¶ããšãã§ããŸãã
å¥ã®äŸã§ãããä»åã¯é£è¡æ©ã®äžã§ãæšçã«åããŠå°æããŸãã ã·ã¥ãŒã¿ãŒã¯ãã°ã©ãäžã«è¡šç€ºãããæ°å€ã®ã㢠(xãy) ãçæãã RNG ã«ãªããŸãã
å·ŠåŽã®ãªãã·ã§ã³ãçŸå®ã«è¿ãããšã«åæããŸããããã¯æ£èŠååžã® RNG ã§ãã ãã ããæã空ã«æãæ£ä¹±ãããå¿
èŠãããå Žåã¯ãåäžãªååžãæ〠RNG ã䜿çšããŠåŸãããé©åãªãªãã·ã§ã³ã®æ¹ãé©ããŠããŸãã äžè¬ã«ãåœé¢ã®ã¿ã¹ã¯ã«å¿ããŠãžã§ãã¬ãŒã¿ãéžæããŸãã
次ã«ãPNG ã·ãŒã±ã³ã¹ã®ãšã³ããããŒã«ã€ããŠè©±ããŸãããã ããšãã°ã次ã®ããã«å§ãŸãã·ãŒã±ã³ã¹ããããŸãã
89ã93ã33ã32ã82ã21ã4ã42ã11ã8ã60ã95ã53ã30ã42ã19ã34ã35ã62ã23ã44ã38ã74ã36ã52ã 18ã58ã79ã65ã45ã99ã90ã82ã20ã41ã13ã88ã76ã82ã24ã5ã54ã72ã19ã80ã2ã74ã36ã71ã9ã ...
äžèŠãããšããããã®æ°åã¯ã©ãã»ã©ã©ã³ãã ãªã®ã§ãããã?ãŸãã¯ååžã確èªããŠã¿ãŸãããã
åäžã«è¿ãããã«èŠããŸãããXNUMX ã€ã®æ°å€ã®ã·ãŒã±ã³ã¹ãèªã¿åããããããå¹³é¢äžã®åº§æšãšããŠè§£éãããšã次ã®ããã«ãªããŸãã
æš¡æ§ãã¯ã£ãããšèŠããããã«ãªããŸãã ãããŠãã·ãŒã±ã³ã¹å
ã®ããŒã¿ã¯ç¹å®ã®æ¹æ³ã§é åºä»ããããŠãã (ã€ãŸãããšã³ããããŒãäœã) ããããŸãã«ãã®ããã€ã¢ã¹ããçããå¯èœæ§ããããŸãã å°ãªããšãããã®ãã㪠PRNG ã¯å¹³é¢äžã®åº§æšãçæããã®ã«ã¯ããŸãé©ããŠããŸããã
å¥ã®ã·ãŒã±ã³ã¹:
42ã72ã17ã0ã30ã0ã15ã9ã47ã19ã35ã86ã40ã54ã97ã42ã69ã19ã20ã88ã4ã3ã67ã27ã42ã 56ã17ã14ã20ã40ã80ã97ã1ã31ã69ã13ã88ã89ã76ã9ã4ã85ã17ã88ã70ã10ã42ã98ã96ã53ã ...
ããã§ã¯é£è¡æ©ã®äžã§ãäœãåé¡ãªãããã§ãã
ããªã¥ãŒã ãèŠãŠã¿ãŸããã (äžåºŠã« XNUMX ã€ã®æ°åãèªã¿ãŸã)ã
ãããŠãŸããã¿ãŒã³ã XNUMX 次å
ã§ããžã¥ã¢ã©ã€ãŒãŒã·ã§ã³ãæ§ç¯ããããšã¯ãã¯ãäžå¯èœã§ãã ãããããã¿ãŒã³ã¯ãã®æ¬¡å
ã«ãããã倧ããªæ¬¡å
ã«ãååšããå¯èœæ§ããããŸãã
PRNG ã«æãå³ããèŠä»¶ã課ãããæå·åã§ã¯ããã®ãããªç¶æ³ã¯çµ¶å¯Ÿã«åãå ¥ããããŸããã ãããã£ãŠããã®å質ãè©äŸ¡ããããã®ç¹å¥ãªã¢ã«ãŽãªãºã ãéçºãããŸããããããã§ã¯è§ŠããŸããã ãã®ãããã¯ã¯åºç¯å²ã«ããããããå¥ã®èšäºã«ãŸãšãã䟡å€ããããŸãã
ãã¹ã
äœã確ããªããšãããããªãå Žåãã©ããã£ãŠå¯ŸåŠããã°ããã§ãããã? ã©ã®ä¿¡å·ã§éè¡ã§ãããåãããªãå Žåãéè·¯ãæž¡ã䟡å€ã¯ãããŸãã? çµæã¯ç°ãªãå ŽåããããŸãã
Unity ã®æªåé«ãã©ã³ãã æ§ã«ã€ããŠãåæ§ã§ãã ããã¥ã¡ã³ãã§å¿ èŠãªè©³çŽ°ãæããã«ãªã£ãŠããã°è¯ãã®ã§ãããèšäºã®åé ã§è¿°ã¹ããããªè©±ã¯ããŸãã«æãŸãã詳现ãæ¬ ããŠããããã«èµ·ãããŸããã
ãŸããããŒã«ãã©ã®ããã«æ©èœããããç¥ããªããã°ãæ£ãã䜿çšããããšã¯ã§ããŸããã äžè¬ã«ãå°ãªããšãååžã«ã€ããŠæçµçã«ç¢ºèªããããã«ãæ€æ»ãšå®éšãå®æœããææãæ¥ãŠããŸãã
解決çã¯ã·ã³ãã«ãã€å¹æçã§ãããçµ±èšãåéãã客芳çãªããŒã¿ãååŸããçµæã確èªãããšãããã®ã§ããã
ç 究ããŒã
Unity ã§ä¹±æ°ãçæããã«ã¯ããã€ãã®æ¹æ³ããããŸããç§ãã¡ã¯ XNUMX ã€ã®æ¹æ³ããã¹ãããŸããã
- System.Random.Next()ã æå®ãããå€ã®ç¯å²å ã®æŽæ°ãçæããŸãã
- System.Random.NextDouble()ã [0; ããã®ç¯å²ã®å粟床æ°å€ãçæããŸãã 1)ã
- UnityEngine.Random.Range()ã æå®ãããå€ã®ç¯å²ã§å粟床æ°å€ (æµ®åå°æ°ç¹) ãçæããŸãã
- UnityEngine.Random.valueã [0; ããã®ç¯å²ã®å粟床æ°å€ (float) ãçæããŸãã 1)ã
- Unity.Mathematics.Random.NextFloat()ã æ°ãã Unity.Mathematics ã©ã€ãã©ãªã®äžéšã§ãã æå®ãããå€ã®ç¯å²ã§å粟床æ°å€ (æµ®åå°æ°ç¹) ãçæããŸãã
UnityEngine.Random.value (ååžãæå®ãããŠããŸããã§ããããUnityEngine.Random.Range() ãšã®é¡æšã«ããåäžã§ããããšãæåŸ ãããŠããŸãã) ãš Unity.Mathematics.Random ãé€ããŠãããã¥ã¡ã³ãã®ã»ãŒãã¹ãŠã®å Žæã§åäžååžãæå®ãããŠããŸããã .NextFloat() (åºæ¬ã¯ xorshift ã¢ã«ãŽãªãºã ã§ããããã¯ããã¯ãäžæ§ãªååžãåŸ ã€å¿ èŠãããããšãæå³ããŸã)ã
ããã©ã«ãã§ã¯ãæåŸ ãããçµæã¯ããã¥ã¡ã³ãã§æå®ãããŠãããšããã«ååŸãããŸãã
æ¹æ³è«
ç§ãã¡ã¯ãæ瀺ãããåæ¹æ³ã䜿çšããŠä¹±æ°ã®ã·ãŒã±ã³ã¹ãçæããçµæããããªãåŠçã®ããã«ä¿åããå°ããªã¢ããªã±ãŒã·ã§ã³ãäœæããŸããã
åã·ãŒã±ã³ã¹ã®é·ã㯠100 åã®æ°å€ã§ãã
ä¹±æ°ã®ç¯å²ã¯ [0, 100) ã§ãã
ããŒã¿ã¯ããã€ãã®ã¿ãŒã²ãã ãã©ãããã©ãŒã ããåéãããŸããã
- Windows
â Unity v2018.3.14f1ããšãã£ã¿ãŒ ã¢ãŒããã¢ãã©ã«ã.NET Standard 2.0 - macOS
â Unity v2018.3.14f1ããšãã£ã¿ãŒ ã¢ãŒããã¢ãã©ã«ã.NET Standard 2.0
â Unity v5.6.4p4ããšãã£ã¿ãŒ ã¢ãŒããã¢ãã©ã«ã.NET Standard 2.0 - Android
â Unity v2018.3.14f1ãããã€ã¹ããšã®ãã«ããMonoã.NET Standard 2.0 - iOS
â Unity v2018.3.14f1ãããã€ã¹ããšã®ãã«ããil2cppã.NET Standard 2.0
å ·çŸå
ä¹±æ°ãçæããã«ã¯ããã€ãã®ç°ãªãæ¹æ³ããããŸãã ããããã«å¯ŸããŠã次ã®ãã®ãæäŸããåå¥ã®ã©ãã㌠ã¯ã©ã¹ãäœæããŸãã
- å€ã®ç¯å²ãèšå®ããå¯èœæ§[æå°/æ倧)ã ã³ã³ã¹ãã©ã¯ã¿ãŒçµç±ã§èšå®ãããŸãã
- MFãè¿ãã¡ãœããã ããäžè¬çãªã®ã§ãåãšã㊠float ãéžæããŸãããã
- çµæãããŒã¯ããããã®çææ¹æ³ã®ååã 䟿å®äžãã¯ã©ã¹ã®å®å šå + MF ã®çæã«äœ¿çšãããã¡ãœããã®ååãå€ãšããŠè¿ããŸãã
ãŸããIRandomGenerator ã€ã³ã¿ãŒãã§ã€ã¹ã«ãã£ãŠè¡šãããæœè±¡åã宣èšããŸãããã
namespace RandomDistribution
{
public interface IRandomGenerator
{
string Name { get; }
float Generate();
}
}
System.Random.Next() ã®å®è£
ãã®ã¡ãœããã§ã¯å€ã®ç¯å²ãèšå®ã§ããŸãããæŽæ°ãè¿ãããŸãããæµ®åå°æ°ç¹æ°ãå¿ èŠã§ãã åçŽã«æŽæ°ãæµ®åå°æ°ç¹ãšããŠè§£éããããšããå€ã®ç¯å²ãæ°æ¡æ¡å€§ããŠããããã¬ã³ãžã®åäžä»£ã§è£æ£ããããšãã§ããŸãã çµæã¯ãäžå®ã®ç²ŸåºŠã®åºå®å°æ°ç¹ã®ãããªãã®ã«ãªããŸãã ãã®ãªãã·ã§ã³ã¯å®éã® float å€ã«è¿ãããããã®ãªãã·ã§ã³ã䜿çšããŸãã
using System;
namespace RandomDistribution
{
public class SystemIntegerRandomGenerator : IRandomGenerator
{
private const int DefaultFactor = 100000;
private readonly Random _generator = new Random();
private readonly int _min;
private readonly int _max;
private readonly int _factor;
public string Name => "System.Random.Next()";
public SystemIntegerRandomGenerator(float min, float max, int factor = DefaultFactor)
{
_min = (int)min * factor;
_max = (int)max * factor;
_factor = factor;
}
public float Generate() => (float)_generator.Next(_min, _max) / _factor;
}
}
System.Random.NextDouble() ã®å®è£
ããã§ã¯ãå€ã®åºå®ç¯å²[0; 1)ã ãããã³ã³ã¹ãã©ã¯ã¿ãŒã§æå®ããããã®ã«æ圱ããã«ã¯ãåçŽãªç®è¡ X * (æå€§å€ â æå°å€) + æå°å€ã䜿çšããŸãã
using System;
namespace RandomDistribution
{
public class SystemDoubleRandomGenerator : IRandomGenerator
{
private readonly Random _generator = new Random();
private readonly double _factor;
private readonly float _min;
public string Name => "System.Random.NextDouble()";
public SystemDoubleRandomGenerator(float min, float max)
{
_factor = max - min;
_min = min;
}
public float Generate() => (float)(_generator.NextDouble() * _factor) + _min;
}
}
UnityEngine.Random.Range() ã®å®è£
UnityEngine.Random éçã¯ã©ã¹ã®ãã®ã¡ãœããã䜿çšãããšãå€ã®ç¯å²ãèšå®ããfloat åãè¿ãããšãã§ããŸãã è¿œå ã®å€æãè¡ãå¿ èŠã¯ãããŸããã
using UnityEngine;
namespace RandomDistribution
{
public class UnityRandomRangeGenerator : IRandomGenerator
{
private readonly float _min;
private readonly float _max;
public string Name => "UnityEngine.Random.Range()";
public UnityRandomRangeGenerator(float min, float max)
{
_min = min;
_max = max;
}
public float Generate() => Random.Range(_min, _max);
}
}
UnityEngine.Random.value ã®å®è£
éçã¯ã©ã¹ UnityEngine.Random ã® value ããããã£ã¯ãå€ã®åºå®ç¯å²ãã float åãè¿ããŸã [0; 1)ã System.Random.NextDouble() ãå®è£ ãããšããšåãããã«ãæå®ãããç¯å²ã«å°åœ±ããŠã¿ãŸãããã
using UnityEngine;
namespace RandomDistribution
{
public class UnityRandomValueGenerator : IRandomGenerator
{
private readonly float _factor;
private readonly float _min;
public string Name => "UnityEngine.Random.value";
public UnityRandomValueGenerator(float min, float max)
{
_factor = max - min;
_min = min;
}
public float Generate() => (float)(Random.value * _factor) + _min;
}
}
Unity.Mathematics.Random.NextFloat() ã®å®è£
Unity.Mathematics.Random ã¯ã©ã¹ã® NextFloat() ã¡ãœãã㯠float åã®æµ®åå°æ°ç¹ãè¿ããå€ã®ç¯å²ãæå®ã§ããŸãã å¯äžã®ãã¥ã¢ã³ã¹ã¯ãUnity.Mathematics.Random ã®åã€ã³ã¹ã¿ã³ã¹ãäœããã®ã·ãŒãã§åæåããå¿ èŠãããããšã§ããããã«ãããç¹°ãè¿ãã·ãŒã±ã³ã¹ã®çæãåé¿ãããŸãã
using Unity.Mathematics;
namespace RandomDistribution
{
public class UnityMathematicsRandomValueGenerator : IRandomGenerator
{
private Random _generator;
private readonly float _min;
private readonly float _max;
public string Name => "Unity.Mathematics.Random.NextFloat()";
public UnityMathematicsRandomValueGenerator(float min, float max)
{
_min = min;
_max = max;
_generator = new Random();
_generator.InitState(unchecked((uint)System.DateTime.Now.Ticks));
}
public float Generate() => _generator.NextFloat(_min, _max);
}
}
MainControllerã®å®è£
IRandomGenerator ã®å®è£ ãããã€ãçšæãããŠããŸãã 次ã«ãã·ãŒã±ã³ã¹ãçæããçµæã®ããŒã¿ã»ãããåŠççšã«ä¿åããå¿ èŠããããŸãã ãããè¡ãã«ã¯ãUnity ã§ã·ãŒã³ãšå°ã㪠MainController ã¹ã¯ãªãããäœæããŸããããã¯ãå¿ èŠãªäœæ¥ããã¹ãŠå®è¡ãããšåæã«ãUI ãšã®å¯Ÿè©±ãæ åœããŸãã
ããŒã¿ã»ããã®ãµã€ãºãš MF å€ã®ç¯å²ãèšå®ããæ§æãããŠåäœããæºåãã§ããŠãããžã§ãã¬ãŒã¿ãŒã®é åãè¿ãã¡ãœãããååŸããŸãããã
namespace RandomDistribution
{
public class MainController : MonoBehaviour
{
private const int DefaultDatasetSize = 100000;
public float MinValue = 0f;
public float MaxValue = 100f;
...
private IRandomGenerator[] CreateRandomGenerators()
{
return new IRandomGenerator[]
{
new SystemIntegerRandomGenerator(MinValue, MaxValue),
new SystemDoubleRandomGenerator(MinValue, MaxValue),
new UnityRandomRangeGenerator(MinValue, MaxValue),
new UnityRandomValueGenerator(MinValue, MaxValue),
new UnityMathematicsRandomValueGenerator(MinValue, MaxValue)
};
}
...
}
}
ããã§ã¯ãããŒã¿ã»ãããäœæããŸãããã ãã®å ŽåãããŒã¿çæã¯ãçµæãããã¹ã ã¹ããªãŒã (csv 圢åŒ) ã«èšé²ããããšãšçµã¿åããããŸãã å IRandomGenerator ã®å€ãæ ŒçŽããããã«ãç¬èªã®åå¥ã®åãå²ãåœãŠãããæåã®è¡ã«ã¯ãžã§ãã¬ãŒã¿ãŒã®ååãå«ãŸããŸãã
namespace RandomDistribution
{
public class MainController : MonoBehaviour
{
...
private void GenerateCsvDataSet(TextWriter writer, int dataSetSize, params IRandomGenerator[] generators)
{
const char separator = ',';
int lastIdx = generators.Length - 1;
// write header
for (int j = 0; j <= lastIdx; j++)
{
writer.Write(generators[j].Name);
if (j != lastIdx)
writer.Write(separator);
}
writer.WriteLine();
// write data
for (int i = 0; i <= dataSetSize; i++)
{
for (int j = 0; j <= lastIdx; j++)
{
writer.Write(generators[j].Generate());
if (j != lastIdx)
writer.Write(separator);
}
if (i != dataSetSize)
writer.WriteLine();
}
}
...
}
}
æ®ã£ãŠããã®ã¯ãGenerateCsvDataSet ã¡ãœãããåŒã³åºããŠçµæããã¡ã€ã«ã«ä¿åãããããããã¯ãŒã¯ãä»ããŠãšã³ã ããã€ã¹ããåä¿¡ãµãŒããŒã«ããŒã¿ãå³åº§ã«è»¢éããããšã ãã§ãã
namespace RandomDistribution
{
public class MainController : MonoBehaviour
{
...
public void GenerateCsvDataSet(string path, int dataSetSize, params IRandomGenerator[] generators)
{
using (var writer = File.CreateText(path))
{
GenerateCsvDataSet(writer, dataSetSize, generators);
}
}
public string GenerateCsvDataSet(int dataSetSize, params IRandomGenerator[] generators)
{
using (StringWriter writer = new StringWriter(CultureInfo.InvariantCulture))
{
GenerateCsvDataSet(writer, dataSetSize, generators);
return writer.ToString();
}
}
...
}
}
ãããžã§ã¯ãã®ãœãŒã¹ã¯æ¬¡ã®ãšããã§ãã
çµæ
å¥è·¡ã¯èµ·ãããŸããã§ããã 圌ããæåŸ ããŠãããã®ã¯ã圌ããåŸããã®ã§ã - ãããã®å Žåããé°è¬ã®æ°é ã®ãªãåçãªåé ã§ããã ãã©ãããã©ãŒã ããšã«å¥ã ã®ã°ã©ããäœæããæå³ãããããŸããããã¹ãŠã®ã°ã©ããã»ãŒåãçµæã瀺ããŠããŸãã
çŸå®ã¯æ¬¡ã®ãšããã§ãã
XNUMX ã€ã®çææ¹æ³ãã¹ãŠããã®ã·ãŒã±ã³ã¹ãå¹³é¢äžã§èŠèŠå:
ãããŠ3Dã§ã®èŠèŠåã åãå
容ã倧éã«çæãããªãããã«ãSystem.Random.Next() ã®çµæã®ã¿ãæ®ããŸãã
UnityEngine.Random ã®æ£èŠååžã«ã€ããŠã®å°å
¥éšã§èªããã話ã¯ç¹°ãè¿ãããŸããã§ãããæåã«èª€ãããã£ãã®ãããã®åŸãšã³ãžã³å
ã§äœããå€æŽããããã®ã©ã¡ããã§ãã ãããä»ãç§ãã¡ã¯ç¢ºä¿¡ããŠããŸãã
åºæïŒ habr.com