
راند جي ترقي ۾، توهان کي اڪثر ڪري بي ترتيب سان ڪجهه ڳنڍڻ جي ضرورت آهي: اتحاد هن لاء پنهنجي رينڊم آهي، ۽ ان سان گڏ ان سان گڏ آهي System.Random. هڪ دفعي، هڪ منصوبي تي، مون کي اهو تاثر مليو ته ٻئي ڪم ڪري سگهن ٿا مختلف طريقي سان (جيتوڻيڪ انهن کي هڪ برابر ورهائڻ گهرجي).
پوءِ اهي تفصيل ۾ نه ويا - اهو ڪافي هو ته منتقلي System.Random سڀني مسئلن کي درست ڪيو. ھاڻي اسان ان کي وڌيڪ تفصيل سان ڏسڻ جو فيصلو ڪيو ۽ ٿورڙي تحقيق ڪرڻ جو فيصلو ڪيو: ڪيئن "متعصب" يا متوقع RNGs آھن، ۽ ڪنھن کي چونڊڻ لاء. ان کان علاوه، مون هڪ کان وڌيڪ ڀيرا ٻڌو آهي متضاد رايا انهن جي "ايمانداري" بابت - اچو ته اهو سمجهڻ جي ڪوشش ڪريون ته حقيقي نتيجن جو اعلان ڪيل نتيجن سان ڪيئن مقابلو آهي.
مختصر تعليمي پروگرام يا RNG اصل ۾ RNG آهي
جيڪڏهن توهان اڳ ۾ ئي واقف آهيو بي ترتيب نمبر جنريٽر، ته توهان فوري طور تي "ٽيسٽنگ" سيڪشن ڏانهن وڃو.
بي ترتيب نمبر (RN) انگن جو هڪ سلسلو آهي جيڪو ڪجهه بي ترتيب (افراتفري) عمل کي استعمال ڪندي، اينٽراپي جو هڪ ذريعو آهي. يعني هي هڪ اهڙو سلسلو آهي جنهن جا عنصر ڪنهن به رياضياتي قانون سان جڙيل نه آهن - انهن جو ڪو به سبب ۽ اثر تعلق ناهي.
جيڪو بي ترتيب نمبر ٺاهي ٿو ان کي بي ترتيب نمبر جنريٽر (RNG) سڏيو ويندو آهي. اهو لڳي ٿو ته سڀ ڪجهه ابتدائي آهي، پر جيڪڏهن اسان نظريي کان مشق ڏانهن وڃون ٿا، ته حقيقت ۾ اهو آسان ناهي ته اهڙي ترتيب پيدا ڪرڻ لاء سافٽ ويئر الگورتھم کي لاڳو ڪرڻ.
اهو ئي سبب آهي ته جديد صارف اليڪٽرانڪس ۾ ساڳئي افراتفري جي غير موجودگي ۾. ان جي بغير، بي ترتيب نمبر بي ترتيب ٿيڻ بند ٿي ويندا آهن، ۽ انهن جو جنريٽر واضح طور تي بيان ڪيل دليلن جي عام فنڪشن ۾ بدلجي ويندو آهي. آئي ٽي فيلڊ ۾ ڪيترن ئي خاصيتن لاء، اهو هڪ سنگين مسئلو آهي (مثال طور، ڪرپٽوگرافي)، پر ٻين لاء مڪمل طور تي قابل قبول حل آهي.
اهو ضروري آهي ته هڪ الورورٿم لکڻ ضروري آهي جيڪو واپس اچي، جيتوڻيڪ واقعي بي ترتيب نمبر نه، پر جيترو ممڪن هجي انهن جي ويجهو - نام نهاد pseudo-random numbers (PRN). هن معاملي ۾ الورورٿم سڏيو ويندو آهي pseudorandom نمبر جنريٽر (PRNG).
PRNG ٺاهڻ لاءِ ڪيترائي آپشن آھن، پر ھيٺيون سڀ ڪنھن لاءِ لاڳاپيل ھونديون:
- ابتدائي شروعات جي ضرورت آهي.
PRNG وٽ اينٽراپي جو ڪو به ذريعو نه آهي، تنهنڪري ان کي استعمال ڪرڻ کان اڳ هڪ ابتدائي حالت ڏني وڃي. اهو هڪ نمبر (يا ویکٹر) جي طور تي بيان ڪيو ويو آهي ۽ هڪ ٻج (بي ترتيب ٻج) سڏيو ويندو آهي. گهڻو ڪري، پروسيسر ڪلاڪ ڪائونٽر يا سسٽم جي وقت جي عددي برابر هڪ ٻج طور استعمال ڪيو ويندو آهي.
- تسلسل reproducibility.
PRNG مڪمل طور تي تعيناتي آهي، تنهن ڪري شروع ڪرڻ دوران بيان ڪيل ٻج منفرد طور تي انگن جي پوري مستقبل جي تسلسل کي طئي ڪري ٿو. هن جو مطلب آهي ته هڪ الڳ PRNG ساڳئي ٻج سان شروع ڪيو ويو آهي (مختلف وقتن تي، مختلف پروگرامن ۾، مختلف ڊوائيسز تي) ساڳيو تسلسل پيدا ڪندو.
توھان کي پڻ ڄاڻڻ جي ضرورت آھي PRNG جي خصوصيت جي امڪاني تقسيم - اھو ڪھڙا نمبر ٺاھيندو ۽ ڪھڙي امڪان سان. گهڻو ڪري اهو يا ته هڪ عام ورڇ يا هڪ يونيفارم ورڇ آهي.

عام ورڇ (کاٻي) ۽ يونيفارم ورڇ (ساڄي)
اچو ته اسان کي 24 پاسن سان صحيح مرڻو آهي. جيڪڏهن توهان ان کي ٽاس ڪريو ٿا، هڪ حاصل ڪرڻ جو امڪان 1/24 جي برابر هوندو (جيئن ئي ڪنهن ٻئي نمبر حاصل ڪرڻ جو امڪان). جيڪڏھن توھان گھڻا اڇلايو ۽ نتيجن کي رڪارڊ ڪيو، توھان کي خبر پوندي ته سڀ ڪنڊا لڳ ڀڳ ساڳي فريڪوئنسي سان نڪرندا آھن. لازمي طور تي، هي مرڻ هڪ يونيفارم ورهائڻ سان آر اين جي سمجهي سگهجي ٿو.
ڇا جيڪڏھن توھان انھن مان 10 کي ھڪڙي وقت ۾ اڇلايو ۽ مجموعي پوائنٽن کي ڳڻيو؟ ڇا ان لاءِ هڪجهڙائي برقرار رهندي؟ نه. گهڻو ڪري، رقم 125 پوائنٽن جي ويجهو هوندو، اهو آهي، ڪجهه سراسري قدر تائين. ۽ نتيجي طور، اڇلائڻ کان اڳ به، توهان مستقبل جي نتيجي جو اندازو لڳائي سگهو ٿا.
ان جو سبب اهو آهي ته سراسري نمبر حاصل ڪرڻ لاءِ مجموعن جو تمام وڏو تعداد موجود آهي. ان کان پري، گهٽ مجموعا - ۽، مطابق، نقصان جو امڪان گهٽ. جيڪڏهن هن ڊيٽا کي تصور ڪيو وڃي، اهو مبہم طور تي هڪ گھنٽي جي شڪل وانگر هوندو. تنهن ڪري، ڪجهه عرصي سان، 10 ڊائيس جي سسٽم کي عام تقسيم سان آر اين جي چئي سگهجي ٿو.
ٻيو مثال، صرف هن وقت هڪ جهاز تي - هڪ ٽارگيٽ تي فائرنگ. شوٽر هڪ RNG هوندو جيڪو ٺاهي ٿو انگن جو هڪ جوڙو (x، y) جيڪو گراف تي ڏيکاريل آهي.

اتفاق ڪيو ته کاٻي پاسي اختيار حقيقي زندگي جي ويجهو آهي - هي هڪ عام تقسيم سان هڪ 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، ...
پهرين نظر ۾ اهي انگ ڪيترا بي ترتيب آهن؟ اچو ته تقسيم جي جانچ ڪندي شروع ڪريون.

اهو يونيفارم جي ويجهو ڏسڻ ۾ اچي ٿو، پر جيڪڏهن توهان ٻن نمبرن جو هڪ تسلسل پڙهو ۽ انهن کي جهاز تي همراهن جي طور تي تفسير ڪريو، توهان هي حاصل ڪندا:

نمونا واضح طور تي نظر اچن ٿا. ۽ جيئن ته ترتيب ۾ ڊيٽا هڪ خاص طريقي سان ترتيب ڏني وئي آهي (يعني، ان ۾ گهٽ اينٽراپي آهي)، اهو ئي "تعصب" کي جنم ڏئي سگهي ٿو. گهٽ ۾ گهٽ، اهڙي 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، ...
جهاز تي به هتي سڀ ڪجهه ٺيڪ لڳي ٿو:

اچو ته حجم ۾ ڏسو (هڪ وقت ۾ ٽي نمبر پڙهو):

۽ ٻيهر نمونن. اهو هاڻي ممڪن ناهي ته هڪ تصوير کي چار ماپن ۾ تعمير ڪرڻ. پر نمونن هن طول و عرض تي ۽ وڏن تي موجود ٿي سگهن ٿا.
cryptography ۾، جتي PRNGs تي تمام سخت ضرورتون لاڳو ڪيون ويون آهن، اهڙي صورتحال واضح طور تي ناقابل قبول آهي. تنهن ڪري، انهن جي معيار کي جانچڻ لاء خاص الگورتھم ٺاهيا ويا آهن، جن کي اسان هاڻي هٿ نه ڪنداسين. موضوع وسيع آهي ۽ هڪ الڳ مضمون جو مستحق آهي.
جاچ
جيڪڏهن اسان پڪ سان ڪجهه نه ٿا ڄاڻون، پوء ان سان ڪيئن ڪم ڪجي؟ ڇا اهو روڊ پار ڪرڻ جي قابل آهي جيڪڏهن توهان کي خبر ناهي ته ڪهڙي ٽريفڪ لائيٽ ان جي اجازت ڏئي ٿي؟ نتيجا مختلف ٿي سگهن ٿا.
ساڳيو ئي اتحاد ۾ بدنام بي ترتيبيءَ لاءِ وڃي ٿو. اھو سٺو آھي جيڪڏھن دستاويز ضروري تفصيلن کي ظاھر ڪري، پر مضمون جي شروعات ۾ بيان ڪيل ڪھاڻي خاص طور تي گھربل تفصيلن جي کوٽ جي ڪري ٿي.
۽ جيڪڏهن توهان کي خبر ناهي ته اهو اوزار ڪيئن ڪم ڪري ٿو، توهان ان کي صحيح طريقي سان استعمال ڪرڻ جي قابل نه هوندا. عام طور تي، وقت اچي ويو آهي جانچڻ ۽ هڪ تجربو هلائڻ لاء آخرڪار يقيني بڻائڻ لاء گهٽ ۾ گهٽ تقسيم بابت.
حل سادو ۽ اثرائتو هو - انگ اکر گڏ ڪريو، مقصدي ڊيٽا حاصل ڪريو ۽ نتيجن کي ڏسو.
مطالعي جو موضوع
اتحاد ۾ بي ترتيب نمبر پيدا ڪرڻ جا ڪيترائي طريقا آھن - اسان پنج آزمايا.
- System.Random.Next(). قدرن جي ڏنل حد ۾ انٽيجرز ٺاهي ٿو.
- System.Random.NextDouble(). [0] کان رينج ۾ ٻه ڀيرا درست نمبر ٺاهي ٿو. 1).
- Unity Engine.Random.Range(). ھڪڙي قيمتي انگن اکرن کي ٺاھي ٿو (فلوٽ) قدر جي ڏنل حد ۾.
- Unity Engine.Random.value. [0; 1).
- Unity.Mathematics.Random.NextFloat(). نئين Unity.Mathematics لائبريري جو حصو. ھڪڙي قيمتي انگن اکرن کي ٺاھي ٿو (فلوٽ) قدر جي ڏنل حد ۾.
دستاويزن ۾ لڳ ڀڳ هر هنڌ هڪ يونيفارم ورهائڻ جي وضاحت ڪئي وئي هئي، سواءِ UnityEngine.Random.value (جتي ورهائڻ جي وضاحت نه ڪئي وئي هئي، پر UnityEngine.Random.Range() يونيفارم سان قياس سان پڻ توقع ڪئي وئي هئي) ۽ Unity.Mathematics.Random .NextFloat() (جتي بنيادي طور تي xorshift الورورٿم آهي، جنهن جو مطلب آهي ته توهان کي ٻيهر يونيفارم ورهائڻ جو انتظار ڪرڻو پوندو).
ڊفالٽ طور، متوقع نتيجا ورتو ويو جيئن دستاويز ۾ بيان ڪيل.
طريقو
اسان هڪ ننڍڙي ايپليڪيشن لکي هئي جيڪا هر پيش ڪيل طريقن کي استعمال ڪندي بي ترتيب انگن جي ترتيب ٺاهي ٿي ۽ نتيجن کي وڌيڪ پروسيسنگ لاء محفوظ ڪيو.
هر تسلسل جي ڊيگهه 100 انگ آهي.
بي ترتيب انگن جي حد آهي [0، 100).
ڊيٽا گڏ ڪئي وئي ڪيترن ئي ٽارگيٽ پليٽ فارمن کان:
- ونڊوز
- اتحاد v2018.3.14f1، ايڊيٽر موڊ، مونو، .NET معياري 2.0 - macOS
- اتحاد v2018.3.14f1، ايڊيٽر موڊ، مونو، .NET معياري 2.0
- اتحاد v5.6.4p4، ايڊيٽر موڊ، مونو، .NET معياري 2.0 - Android
— Unity v2018.3.14f1، بلڊ في ڊيوائس، مونو، .NET معياري 2.0 - به iOS
- Unity v2018.3.14f1، بلڊ في ڊيوائس، il2cpp، .NET معياري 2.0
عمل
اسان وٽ بي ترتيب نمبر ٺاهڻ جا ڪيترائي مختلف طريقا آهن. انهن مان هر هڪ لاء، اسين هڪ الڳ لفافي ڪلاس لکنداسين، جنهن کي مهيا ڪرڻ گهرجي:
- قدرن جي حد مقرر ڪرڻ جو امڪان [من/ وڌ ۾ وڌ). ٺاھيندڙ ذريعي مقرر ڪيو ويندو.
- MF واپسي جو طريقو. اچو ته فلوٽ کي قسم جي طور تي چونڊيو، جيئن اهو وڌيڪ عام آهي.
- نتيجن جي نشاندهي لاءِ نسل جي طريقي جو نالو. سهولت لاءِ، اسين قدر جي طور تي واپس ڪنداسين ڪلاس جو پورو نالو + MF پيدا ڪرڻ لاءِ استعمال ڪيل طريقي جو نالو.
پهرين، اچو ته هڪ تجريد جو اعلان ڪريون جيڪو IRandomGenerator انٽرفيس جي نمائندگي ڪندو:
namespace RandomDistribution
{
public interface IRandomGenerator
{
string Name { get; }
float Generate();
}
}System.Random.Next () جو نفاذ
اهو طريقو توهان کي قدرن جي حد مقرر ڪرڻ جي اجازت ڏئي ٿو، پر اهو انٽيجرز واپس ڏئي ٿو، پر فلوٽس جي ضرورت آهي. توھان آسانيءَ سان انٽيجر کي فلوٽ سمجھي سگھو ٿا، يا توھان قدرن جي حد کي وڌائي سگھوٿا ڪيترن ئي آرڊرن سان، انھن کي معاوضو ڏئي وچين درجي جي ھر نسل سان. نتيجو ڪجهه ٿيندو جيئن هڪ مقرر ٿيل نقطي جي درستگي جي ڏنل ترتيب سان. اسان هي اختيار استعمال ڪنداسين ڇو ته اهو حقيقي فلوٽ قيمت جي ويجهو آهي.
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 * (max − min) + min.
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 جامد طبقي جو هي طريقو توهان کي قدرن جي حد مقرر ڪرڻ جي اجازت ڏئي ٿو ۽ هڪ فلوٽ قسم واپس ڪري ٿو. توهان کي ڪا به اضافي تبديلي ڪرڻ جي ضرورت ناهي.
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 قدرن جي مقرر ڪيل حد مان هڪ فلوٽ قسم واپس ڪري ٿو [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() طريقو فلوٽ قسم جو فلوٽنگ پوائنٽ ڏئي ٿو ۽ توهان کي قدرن جي حد بيان ڪرڻ جي اجازت ڏئي ٿو. رڳو اهم ڳالهه اها آهي ته 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 جا ڪيترائي عمل تيار آھن. اڳيون، توهان کي ترتيب ڏيڻ جي ضرورت آهي ۽ پروسيسنگ لاء نتيجو ڊيٽا سيٽ محفوظ ڪريو. هن کي ڪرڻ لاءِ، اسان يونيٽي ۾ هڪ منظر ۽ هڪ ننڍڙو مين ڪنٽرولر اسڪرپٽ ٺاهينداسين، جيڪو سڀ ضروري ڪم ڪندو ۽ ساڳئي وقت UI سان رابطي لاءِ ذميوار هوندو.
اچو ته ڊيٽا سيٽ جي سائيز ۽ ايم ايف جي قيمتن جي حد کي ترتيب ڏيو، ۽ پڻ هڪ طريقو حاصل ڪريو جيڪو ترتيب ڏنل جنريٽر جي هڪ صف کي واپس ڪري ٿو ۽ ڪم ڪرڻ لاء تيار آهي.
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();
}
}
...
}
}پروجيڪٽ جا ذريعا آهن .
نتيجا
ڪو معجزو نه ٿيو. انهن جي توقع اها آهي ته انهن کي ڇا مليو - سڀني حالتن ۾، هڪ به تقسيم بغير سازش جي اشاري جي. مون کي پليٽ فارمن لاءِ الڳ گراف لڳائڻ ۾ نقطو نظر نه ٿو اچي - اهي سڀ تقريباً ساڳيا نتيجا ڏيکارين ٿا.
حقيقت اها آهي ته:

جهاز تي سڀني پنجن نسلن جي طريقن مان ترتيبن جو تصور:

۽ 3D ۾ بصري. مان صرف System.Random.Next() جو نتيجو ڇڏيندس ته جيئن هڪجهڙائي واري مواد جو هڪ گروپ پيدا نه ٿئي.

ڪهاڻي UnityEngine جي عام ورڇ جي باري ۾ تعارف ۾ ٻڌايو ويو آهي. رينڊم پاڻ کي نه ورجايو: يا ته اهو شروعاتي طور تي غلط هو، يا انجڻ ۾ ڪجهه تبديل ٿي چڪو آهي. پر هاڻي اسان کي پڪ آهي.
جو ذريعو: www.habr.com
