BlessRNG یا انصاف کے لیے RNG کو چیک کرنا

BlessRNG یا انصاف کے لیے RNG کو چیک کرنا

گیم ڈویلپمنٹ میں، آپ کو اکثر بے ترتیبی کے ساتھ کچھ باندھنے کی ضرورت ہوتی ہے: اس کے لیے یونٹی کا اپنا رینڈم ہوتا ہے، اور اس کے متوازی نظام ہوتا ہے۔ ایک زمانے میں، ایک پروجیکٹ پر، مجھے یہ تاثر ملا کہ دونوں مختلف طریقے سے کام کر سکتے ہیں (حالانکہ ان کی تقسیم بھی ہونی چاہیے)۔

پھر وہ تفصیلات میں نہیں گئے - یہ کافی تھا کہ System.Random میں منتقلی نے تمام مسائل کو درست کر دیا۔ اب ہم نے اس پر مزید تفصیل سے غور کرنے اور تھوڑی تحقیق کرنے کا فیصلہ کیا: "متعصب" یا پیشین گوئی کرنے والے RNGs کتنے ہیں، اور کس کا انتخاب کرنا ہے۔ مزید یہ کہ، میں نے ان کی "ایمانداری" کے بارے میں ایک سے زیادہ مرتبہ متضاد آراء سنی ہیں - آئیے یہ جاننے کی کوشش کریں کہ حقیقی نتائج کا اعلان کردہ نتائج سے کیا موازنہ کیا جاتا ہے۔

مختصر تعلیمی پروگرام یا RNG دراصل RNG ہے۔

اگر آپ پہلے سے ہی بے ترتیب نمبر جنریٹرز سے واقف ہیں، تو آپ فوری طور پر "ٹیسٹنگ" سیکشن پر جا سکتے ہیں۔

بے ترتیب نمبر (RN) کچھ بے ترتیب (افراتفری) عمل کا استعمال کرتے ہوئے پیدا ہونے والے اعداد کا ایک سلسلہ ہے، جو اینٹروپی کا ایک ذریعہ ہے۔ یعنی یہ ایک ایسی ترتیب ہے جس کے عناصر کسی بھی ریاضی کے قانون سے آپس میں جڑے ہوئے نہیں ہیں - ان کا کوئی سبب اور اثر کا رشتہ نہیں ہے۔

جو چیز بے ترتیب نمبر بناتی ہے اسے بے ترتیب نمبر جنریٹر (RNG) کہا جاتا ہے۔ ایسا لگتا ہے کہ سب کچھ ابتدائی ہے، لیکن اگر ہم تھیوری سے پریکٹس کی طرف جائیں، تو درحقیقت اس طرح کی ترتیب پیدا کرنے کے لیے سافٹ ویئر الگورتھم کو نافذ کرنا اتنا آسان نہیں ہے۔

اس کی وجہ جدید کنزیومر الیکٹرانکس میں اسی افراتفری کی عدم موجودگی ہے۔ اس کے بغیر، بے ترتیب نمبر بے ترتیب ہونا بند ہو جاتے ہیں، اور ان کا جنریٹر واضح طور پر متعین دلائل کے ایک عام فنکشن میں بدل جاتا ہے۔ آئی ٹی فیلڈ میں متعدد خصوصیات کے لیے، یہ ایک سنگین مسئلہ ہے (مثال کے طور پر، خفیہ نگاری)، لیکن دوسروں کے لیے مکمل طور پر قابل قبول حل ہے۔

ایک الگورتھم لکھنا ضروری ہے جو واپس آئے، اگرچہ صحیح معنوں میں بے ترتیب نمبر نہ ہوں، لیکن جتنا ممکن ہو ان کے قریب ہو - نام نہاد سیوڈو رینڈم نمبرز (PRN)۔ اس معاملے میں الگورتھم کو سیوڈورنڈم نمبر جنریٹر (PRNG) کہا جاتا ہے۔

PRNG بنانے کے لیے کئی آپشنز ہیں، لیکن درج ذیل سب کے لیے موزوں ہوں گے:

  1. ابتدائی ابتداء کی ضرورت۔

    PRNG کے پاس اینٹروپی کا کوئی ذریعہ نہیں ہے، لہذا اسے استعمال کرنے سے پہلے ابتدائی حالت دی جانی چاہیے۔ یہ ایک عدد (یا ویکٹر) کے طور پر بیان کیا جاتا ہے اور اسے بیج (بے ترتیب بیج) کہا جاتا ہے۔ اکثر، پروسیسر کلاک کاؤنٹر یا نظام کے وقت کے عددی مساوی کو بطور بیج استعمال کیا جاتا ہے۔

  2. تسلسل تولیدی صلاحیت۔

    PRNG مکمل طور پر تعییناتی ہے، اس لیے ابتدا کے دوران مخصوص کردہ بیج اعداد کی مستقبل کی پوری ترتیب کو منفرد طور پر متعین کرتا ہے۔ اس کا مطلب یہ ہے کہ ایک ہی بیج کے ساتھ شروع کی گئی علیحدہ PRNG (مختلف اوقات میں، مختلف پروگراموں میں، مختلف آلات پر) ایک ہی ترتیب پیدا کرے گی۔

آپ کو PRNG کی خصوصیت کے حامل امکانی تقسیم کو بھی جاننا ہوگا - یہ کون سے نمبر پیدا کرے گا اور کس امکان کے ساتھ۔ اکثر یہ یا تو عام تقسیم یا یکساں تقسیم ہوتی ہے۔
BlessRNG یا انصاف کے لیے RNG کو چیک کرنا
عام تقسیم (بائیں) اور یکساں تقسیم (دائیں)

ہم کہتے ہیں کہ ہمارے پاس 24 اطراف کے ساتھ فیئر ڈائی ہے۔ اگر آپ اسے ٹاس کرتے ہیں تو ایک حاصل کرنے کا امکان 1/24 کے برابر ہو جائے گا (کسی دوسرے نمبر کے حاصل کرنے کے امکان کے برابر)۔ اگر آپ بہت سے تھرو کرتے ہیں اور نتائج کو ریکارڈ کرتے ہیں، تو آپ دیکھیں گے کہ تمام کنارے تقریباً ایک ہی فریکوئنسی کے ساتھ گرتے ہیں۔ بنیادی طور پر، اس ڈائی کو یکساں تقسیم کے ساتھ RNG سمجھا جا سکتا ہے۔

کیا ہوگا اگر آپ ان میں سے 10 ڈائس ایک ساتھ پھینک دیں اور کل پوائنٹس گنیں؟ کیا اس کے لیے یکسانیت برقرار رہے گی؟ نہیں. اکثر، رقم 125 پوائنٹس کے قریب ہوگی، یعنی کچھ اوسط قدر کے قریب۔ اور نتیجے کے طور پر، پھینکنے سے پہلے ہی، آپ مستقبل کے نتیجے کا اندازہ لگا سکتے ہیں۔

وجہ یہ ہے کہ اوسط سکور حاصل کرنے کے لیے سب سے زیادہ تعداد میں امتزاج موجود ہیں۔ اس سے جتنا دور ہوگا، کم امتزاج - اور، اس کے مطابق، نقصان کا امکان اتنا ہی کم ہوگا۔ اگر اس ڈیٹا کو تصور کیا جائے تو یہ مبہم طور پر گھنٹی کی شکل سے مشابہ ہوگا۔ لہذا، کچھ مسلسل کے ساتھ، 10 ڈائس کے نظام کو عام تقسیم کے ساتھ RNG کہا جا سکتا ہے۔

ایک اور مثال، ایک ہوائی جہاز پر صرف اس وقت - ایک ہدف پر شوٹنگ. شوٹر ایک RNG ہوگا جو نمبروں کا ایک جوڑا (x, y) بناتا ہے جو گراف پر ظاہر ہوتا ہے۔
BlessRNG یا انصاف کے لیے RNG کو چیک کرنا
اس بات سے اتفاق کریں کہ بائیں طرف کا آپشن حقیقی زندگی کے قریب ہے - یہ ایک عام تقسیم کے ساتھ ایک RNG ہے۔ لیکن اگر آپ کو تاریک آسمان میں ستارے بکھیرنے کی ضرورت ہے، تو یکساں تقسیم کے ساتھ RNG کا استعمال کرتے ہوئے حاصل کیا جانے والا صحیح آپشن زیادہ موزوں ہے۔ عام طور پر، ہاتھ میں کام کے لحاظ سے ایک جنریٹر کا انتخاب کریں۔

اب پی این جی کی ترتیب کی اینٹروپی کے بارے میں بات کرتے ہیں۔ مثال کے طور پر، ایک سلسلہ ہے جو اس طرح شروع ہوتا ہے:

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، ...

پہلی نظر میں یہ نمبر کتنے بے ترتیب ہیں؟ آئیے تقسیم کی جانچ کرکے شروع کریں۔
BlessRNG یا انصاف کے لیے RNG کو چیک کرنا
یہ یونیفارم کے قریب نظر آتا ہے، لیکن اگر آپ دو نمبروں کی ترتیب کو پڑھتے ہیں اور ہوائی جہاز میں نقاط کے طور پر ان کی تشریح کرتے ہیں، تو آپ کو یہ ملتا ہے:
BlessRNG یا انصاف کے لیے RNG کو چیک کرنا
پیٹرن واضح طور پر نظر آتے ہیں. اور چونکہ ترتیب میں موجود ڈیٹا کو ایک خاص طریقے سے ترتیب دیا گیا ہے (یعنی اس میں اینٹروپی کم ہے)، اس سے اس "تعصب" کو جنم دے سکتا ہے۔ کم از کم، اس طرح کی 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، ...

یہاں تک کہ ہوائی جہاز میں بھی سب کچھ ٹھیک لگتا ہے:
BlessRNG یا انصاف کے لیے RNG کو چیک کرنا
آئیے حجم میں دیکھیں (ایک وقت میں تین نمبر پڑھیں):
BlessRNG یا انصاف کے لیے RNG کو چیک کرنا
اور پھر پیٹرن. اب چار جہتوں میں تصور کی تعمیر ممکن نہیں ہے۔ لیکن پیٹرن اس جہت اور بڑے پر موجود ہو سکتے ہیں۔

خفیہ نگاری میں، جہاں PRNGs پر سخت ترین تقاضے عائد کیے جاتے ہیں، ایسی صورت حال واضح طور پر ناقابل قبول ہے۔ لہٰذا، ان کے معیار کا اندازہ لگانے کے لیے خصوصی الگورتھم تیار کیے گئے ہیں، جن پر ہم ابھی ہاتھ نہیں لگائیں گے۔ موضوع وسیع ہے اور ایک الگ مضمون کا مستحق ہے۔

ٹیسٹنگ

اگر ہم یقینی طور پر کچھ نہیں جانتے ہیں، تو اس کے ساتھ کیسے کام کریں؟ اگر آپ نہیں جانتے کہ کون سی ٹریفک لائٹ اس کی اجازت دیتی ہے تو کیا یہ سڑک عبور کرنے کے قابل ہے؟ اس کے نتائج مختلف ہو سکتے ہیں۔

اتحاد میں بدنام زمانہ بے ترتیب پن کا بھی یہی حال ہے۔ یہ اچھی بات ہے اگر دستاویزات ضروری تفصیلات کو ظاہر کرتی ہیں، لیکن مضمون کے شروع میں بیان کردہ کہانی مطلوبہ تفصیلات کی کمی کی وجہ سے واقع ہوئی ہے۔

اور اگر آپ نہیں جانتے کہ ٹول کیسے کام کرتا ہے، تو آپ اسے صحیح طریقے سے استعمال نہیں کر پائیں گے۔ عام طور پر، وقت آ گیا ہے کہ جانچ پڑتال کریں اور تجربہ کریں تاکہ آخر کار کم از کم تقسیم کے بارے میں یقینی بنایا جا سکے۔

حل آسان اور موثر تھا - اعداد و شمار جمع کریں، معروضی ڈیٹا حاصل کریں اور نتائج دیکھیں۔

مطالعہ کا موضوع

Unity میں بے ترتیب نمبر بنانے کے کئی طریقے ہیں - ہم نے پانچ کا تجربہ کیا۔

  1. System.Random.Next()۔ اقدار کی دی گئی رینج میں عددی اعداد تیار کرتا ہے۔
  2. System.Random.NextDouble(). [0; 1)۔
  3. UnityEngine.Random.Range(). اقدار کی دی گئی رینج میں واحد درستگی نمبر (فلوٹس) تیار کرتا ہے۔
  4. Unity Engine.Random.value. [0; 1)۔
  5. Unity.Mathematics.Random.NextFloat(). نئی Unity.Mathematics لائبریری کا حصہ۔ اقدار کی دی گئی رینج میں واحد درستگی نمبر (فلوٹس) تیار کرتا ہے۔

دستاویزات میں تقریباً ہر جگہ یکساں تقسیم کی وضاحت کی گئی تھی، سوائے UnityEngine.Random.value (جہاں تقسیم کی وضاحت نہیں کی گئی تھی، لیکن UnityEngine.Random.Range() یونیفارم کے ساتھ مشابہت کی بھی توقع تھی) اور Unity.Mathematics.Random .NextFloat() (جہاں کی بنیاد xorshift الگورتھم ہے، جس کا مطلب ہے کہ آپ کو دوبارہ یکساں تقسیم کا انتظار کرنا ہوگا)۔

پہلے سے طے شدہ طور پر، متوقع نتائج کو دستاویزات میں بیان کردہ کے طور پر لیا گیا تھا۔

ٹیکنالوجی

ہم نے ایک چھوٹی ایپلی کیشن لکھی جس نے پیش کردہ طریقوں میں سے ہر ایک کو استعمال کرتے ہوئے بے ترتیب نمبروں کی ترتیب تیار کی اور نتائج کو مزید پروسیسنگ کے لیے محفوظ کیا۔

ہر ترتیب کی لمبائی 100 نمبر ہے۔
بے ترتیب نمبروں کی حد [0، 100) ہے۔

متعدد ٹارگٹ پلیٹ فارمز سے ڈیٹا اکٹھا کیا گیا تھا:

  • ونڈوز
    — Unity v2018.3.14f1، ایڈیٹر موڈ، مونو، .NET سٹینڈرڈ 2.0
  • MacOS کے لئے اولمپ ٹریڈ ایپ
    — Unity v2018.3.14f1، ایڈیٹر موڈ، مونو، .NET سٹینڈرڈ 2.0
    — Unity v5.6.4p4، ایڈیٹر موڈ، مونو، .NET سٹینڈرڈ 2.0
  • اینڈرائڈ
    — Unity v2018.3.14f1، بلٹ فی ڈیوائس، مونو، .NET سٹینڈرڈ 2.0
  • iOS
    — Unity v2018.3.14f1، بلٹ فی ڈیوائس، il2cpp، .NET سٹینڈرڈ 2.0

Реализация

ہمارے پاس بے ترتیب نمبر بنانے کے کئی مختلف طریقے ہیں۔ ان میں سے ہر ایک کے لیے، ہم ایک علیحدہ ریپر کلاس لکھیں گے، جس کو فراہم کرنا چاہیے:

  1. اقدار کی حد مقرر کرنے کا امکان [منٹ/زیادہ سے زیادہ)۔ کنسٹرکٹر کے ذریعے سیٹ کیا جائے گا۔
  2. MF کو واپس کرنے کا طریقہ۔ آئیے قسم کے طور پر فلوٹ کا انتخاب کریں، کیونکہ یہ زیادہ عام ہے۔
  3. نتائج کو نشان زد کرنے کے لیے نسل کے طریقہ کار کا نام۔ سہولت کے لیے، ہم ایک قدر کے طور پر کلاس کا پورا نام + 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 * (زیادہ سے زیادہ − منٹ) + منٹ۔

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 static کلاس کا یہ طریقہ آپ کو قدروں کی ایک رینج سیٹ کرنے کی اجازت دیتا ہے اور ایک فلوٹ قسم واپس کرتا ہے۔ آپ کو کوئی اضافی تبدیلیاں کرنے کی ضرورت نہیں ہے۔

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 کی ویلیو پراپرٹی۔ رینڈم قدروں کی ایک مقررہ حد سے ایک فلوٹ قسم واپس کرتا ہے [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);
    }
}

مین کنٹرولر کا نفاذ

IRandomGenerator کے متعدد نفاذ تیار ہیں۔ اگلا، آپ کو ترتیب تیار کرنے اور نتیجے میں ڈیٹا سیٹ کو پروسیسنگ کے لیے محفوظ کرنے کی ضرورت ہے۔ ایسا کرنے کے لیے، ہم یونٹی میں ایک سین اور ایک چھوٹا مین کنٹرولر اسکرپٹ بنائیں گے، جو تمام ضروری کام کرے گا اور ساتھ ہی 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();
            }
        }

        ...
    }
}

پراجیکٹ کے ذرائع ہیں۔ GitLab.

نتائج

کوئی معجزہ نہیں ہوا۔ انہوں نے جس چیز کی توقع کی وہ وہی ہے جو انہیں ملا - تمام صورتوں میں، سازشوں کے اشارے کے بغیر یکساں تقسیم۔ مجھے پلیٹ فارمز کے لیے الگ الگ گراف لگانے کا کوئی فائدہ نظر نہیں آتا - وہ سب تقریباً ایک جیسے نتائج دکھاتے ہیں۔

حقیقت یہ ہے:
BlessRNG یا انصاف کے لیے RNG کو چیک کرنا

پانچوں نسل کے طریقوں سے ہوائی جہاز پر ترتیب کا تصور:
BlessRNG یا انصاف کے لیے RNG کو چیک کرنا

اور 3D میں ویژولائزیشن۔ میں صرف System.Random.Next() کا نتیجہ چھوڑوں گا تاکہ ایک جیسے مواد کا ایک گروپ تیار نہ ہو۔
BlessRNG یا انصاف کے لیے RNG کو چیک کرنا

یونٹی انجن کی عام تقسیم کے بارے میں تعارف میں بتائی گئی کہانی۔ رینڈم نے خود کو نہیں دہرایا: یا تو یہ ابتدائی طور پر غلط تھا، یا پھر انجن میں کچھ بدل گیا ہے۔ لیکن اب ہمیں یقین ہے۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں