BlessRNG tabi ṣayẹwo RNG fun ododo

BlessRNG tabi ṣayẹwo RNG fun ododo

Ni idagbasoke ere, o nilo nigbagbogbo lati di nkan kan pẹlu ID: Isokan ni ID tirẹ fun eyi, ati ni afiwe pẹlu rẹ System.Random. Ni ẹẹkan, lori ọkan ninu awọn iṣẹ akanṣe, Mo ni imọran pe awọn mejeeji le ṣiṣẹ ni oriṣiriṣi (biotilejepe wọn yẹ ki o ni pinpin paapaa).

Lẹhinna wọn ko lọ sinu awọn alaye - o to pe iyipada si System.Random ṣe atunṣe gbogbo awọn iṣoro naa. Bayi a pinnu lati wo inu rẹ ni awọn alaye diẹ sii ati ṣe iwadii kekere kan: bii “aiṣedeede” tabi awọn RNG asọtẹlẹ jẹ, ati kini lati yan. Pẹlupẹlu, Mo ti gbọ diẹ sii ju ẹẹkan lọ awọn imọran ti o fi ori gbarawọn nipa “iṣotitọ” wọn - jẹ ki a gbiyanju lati ro bi awọn abajade gidi ṣe afiwe pẹlu awọn ti a kede.

Finifini eto eko tabi RNG kosi RNG

Ti o ba ti mọ tẹlẹ pẹlu awọn olupilẹṣẹ nọmba ID, lẹhinna o le foju lẹsẹkẹsẹ si apakan “Igbeyewo”.

Awọn nọmba ID (RN) jẹ ọkọọkan awọn nọmba ti ipilẹṣẹ nipa lilo diẹ ninu awọn ilana laileto (rudurudu), orisun ti entropy. Iyẹn ni, eyi jẹ ọna ti awọn eroja ko ni asopọ nipasẹ eyikeyi ofin mathematiki - wọn ko ni ibatan-fa-ati-ipa.

Ohun ti o ṣẹda ID nọmba ni a npe ni a ID nọmba monomono (RNG). Yoo dabi pe ohun gbogbo jẹ alakọbẹrẹ, ṣugbọn ti a ba gbe lati imọ-jinlẹ si adaṣe, lẹhinna ni otitọ kii ṣe rọrun lati ṣe imuse algorithm sọfitiwia kan fun ṣiṣẹda iru ọkọọkan kan.

Idi naa wa ni isansa ti rudurudu kanna ni ẹrọ itanna olumulo ode oni. Laisi rẹ, awọn nọmba laileto dẹkun lati jẹ laileto, ati pe olupilẹṣẹ wọn yipada si iṣẹ lasan ti awọn ariyanjiyan asọye. Fun nọmba awọn iyasọtọ pataki ni aaye IT, eyi jẹ iṣoro pataki (fun apẹẹrẹ, cryptography), ṣugbọn fun awọn miiran ojutu itẹwọgba patapata wa.

O jẹ dandan lati kọ alugoridimu kan ti yoo pada, botilẹjẹpe kii ṣe awọn nọmba laileto nitootọ, ṣugbọn bi o ti ṣee ṣe si wọn - eyiti a pe ni awọn nọmba apseudo-ID (PRN). Algoridimu ninu ọran yii ni a pe ni olupilẹṣẹ nọmba pseudorandom (PRNG).

Awọn aṣayan pupọ wa fun ṣiṣẹda PRNG, ṣugbọn atẹle yoo jẹ pataki fun gbogbo eniyan:

  1. Iwulo fun ipilẹṣẹ alakoko.

    PRNG ko ni orisun ti entropy, nitorinaa o gbọdọ fun ni ipo ibẹrẹ ṣaaju lilo. O ti wa ni pato bi nọmba (tabi fekito) ati pe a npe ni irugbin (irugbin ID). Nigbagbogbo, counter aago ero isise tabi deede nọmba ti akoko eto ni a lo bi irugbin.

  2. Reproducibility ọkọọkan.

    PRNG jẹ ipinnu patapata, nitorinaa irugbin ti a sọ tẹlẹ lakoko ibẹrẹ ni iyasọtọ pinnu gbogbo ọkọọkan awọn nọmba ọjọ iwaju. Eyi tumọ si pe PRNG ọtọtọ ti a ṣe ipilẹṣẹ pẹlu irugbin kanna (ni awọn akoko oriṣiriṣi, ni awọn oriṣiriṣi awọn eto, lori awọn ẹrọ oriṣiriṣi) yoo ṣe agbekalẹ ọkọọkan kanna.

O tun nilo lati mọ pinpin iṣeeṣe ti n ṣe afihan PRNG - awọn nọmba wo ni yoo ṣe ati pẹlu iṣeeṣe wo. Ni ọpọlọpọ igba eyi jẹ boya pinpin deede tabi pinpin aṣọ.
BlessRNG tabi ṣayẹwo RNG fun ododo
Pipin deede (osi) ati pinpin aṣọ (ọtun)

Jẹ ká sọ pé a itẹ kú pẹlu 24 mejeji. Ti o ba ju silẹ, iṣeeṣe gbigba ọkan yoo dọgba si 1/24 (kanna pẹlu iṣeeṣe gbigba nọmba miiran). Ti o ba ṣe ọpọlọpọ awọn jiju ati ṣe igbasilẹ awọn abajade, iwọ yoo ṣe akiyesi pe gbogbo awọn egbegbe ṣubu jade pẹlu isunmọ igbohunsafẹfẹ kanna. Ni pataki, ku yii le jẹ RNG pẹlu pinpin aṣọ kan.

Kini ti o ba jabọ 10 ti awọn ṣẹ wọnyi ni ẹẹkan ati ka awọn aaye lapapọ? Yoo uniformity wa ni muduro fun o? Rara. Ni ọpọlọpọ igba, iye naa yoo sunmọ awọn aaye 125, iyẹn ni, si iye apapọ kan. Ati bi abajade, paapaa ṣaaju ṣiṣe jiju, o le ṣe iṣiro ni aijọju abajade ọjọ iwaju.

Idi ni pe nọmba awọn akojọpọ ti o tobi julọ wa lati gba Dimegilio apapọ. Ti o jinna si rẹ, awọn akojọpọ diẹ - ati, ni ibamu, kekere iṣeeṣe ti pipadanu. Ti data yii ba jẹ ojuran, yoo dabi apẹrẹ ti agogo. Nitorina, pẹlu diẹ ninu awọn na, a eto ti 10 ṣẹ le ti wa ni a npe ni ohun RNG pẹlu kan deede pinpin.

Apeere miiran, nikan ni akoko yii lori ọkọ ofurufu - ibon ni ibi-afẹde kan. Ayanbon yoo jẹ RNG ti o ṣe agbejade awọn nọmba meji (x, y) ti o han lori awọnya.
BlessRNG tabi ṣayẹwo RNG fun ododo
Gba pe aṣayan ti o wa ni apa osi jẹ isunmọ si igbesi aye gidi - eyi jẹ RNG pẹlu pinpin deede. Ṣugbọn ti o ba nilo lati tuka awọn irawọ ni ọrun dudu, lẹhinna aṣayan ti o tọ, ti o gba ni lilo RNG pẹlu pinpin aṣọ, dara julọ. Ni gbogbogbo, yan monomono kan da lori iṣẹ-ṣiṣe ti o wa ni ọwọ.

Bayi jẹ ki a sọrọ nipa entropy ti ọna PNG. Fun apẹẹrẹ, ọna kan wa ti o bẹrẹ bi eleyi:

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

Bawo ni awọn nọmba wọnyi jẹ laileto ni wiwo akọkọ? Jẹ ká bẹrẹ nipa yiyewo awọn pinpin.
BlessRNG tabi ṣayẹwo RNG fun ododo
O dabi isunmọ si aṣọ ile, ṣugbọn ti o ba ka ọkọọkan awọn nọmba meji ti o tumọ wọn bi awọn ipoidojuko lori ọkọ ofurufu, o gba eyi:
BlessRNG tabi ṣayẹwo RNG fun ododo
Awọn awoṣe di kedere han. Ati pe niwọn igba ti data ti o wa ninu ọkọọkan ti paṣẹ ni ọna kan (iyẹn ni, o ni entropy kekere), eyi le funni ni “ijusi” pupọ. Ni o kere ju, iru PRNG ko dara pupọ fun ṣiṣẹda awọn ipoidojuko lori ọkọ ofurufu kan.

Ilana miiran:

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

Ohun gbogbo dabi pe o dara nibi paapaa lori ọkọ ofurufu:
BlessRNG tabi ṣayẹwo RNG fun ododo
Jẹ ki a wo ni iwọn didun (ka awọn nọmba mẹta ni akoko kan):
BlessRNG tabi ṣayẹwo RNG fun ododo
Ati lẹẹkansi awọn awoṣe. Ko ṣee ṣe lati ṣe agbero wiwo ni awọn iwọn mẹrin. Ṣugbọn awọn ilana le wa lori iwọn yii ati lori awọn ti o tobi julọ.

Ni cryptography, nibiti awọn ibeere ti o lagbara julọ ti paṣẹ lori PRNGs, iru ipo bẹẹ jẹ itẹwẹgba ni pato. Nitorina, awọn algoridimu pataki ti ni idagbasoke lati ṣe ayẹwo didara wọn, eyiti a kii yoo fi ọwọ kan ni bayi. Awọn koko ni sanlalu ati ki o balau kan lọtọ article.

Igbeyewo

Ti a ko ba mọ ohunkan daju, lẹhinna bawo ni a ṣe le ṣiṣẹ pẹlu rẹ? Ṣe o tọ lati kọja ni opopona ti o ko ba mọ iru ina ijabọ ti o gba laaye? Awọn abajade le yatọ.

Kanna n lọ fun awọn sina randomness ni isokan. O dara ti iwe naa ba ṣafihan awọn alaye pataki, ṣugbọn itan ti a mẹnuba ni ibẹrẹ nkan naa ṣẹlẹ ni deede nitori aini awọn pato ti o fẹ.

Ati pe ti o ko ba mọ bi ọpa naa ṣe n ṣiṣẹ, iwọ kii yoo ni anfani lati lo bi o ti tọ. Ni gbogbogbo, akoko ti de lati ṣayẹwo ati ṣe idanwo lati nikẹhin rii daju pe o kere ju nipa pinpin.

Ojutu naa rọrun ati imunadoko - gba awọn iṣiro, gba data idi ati wo awọn abajade.

Koko-ọrọ ti iwadi

Awọn ọna pupọ lo wa lati ṣe ina awọn nọmba laileto ni Iṣọkan - a ṣe idanwo marun.

  1. System.Random.Next(). Ṣe ipilẹṣẹ awọn nọmba ni iwọn ti a fun ni awọn iye.
  2. System.Random.NextDouble (). Ṣe ina awọn nọmba konge ilọpo meji ni ibiti o wa lati [0; 1).
  3. UnityEngine.Random.Range (). Ṣe ipilẹṣẹ awọn nọmba konge ẹyọkan (fofo) ni iwọn ti a fun ni awọn iye.
  4. UnityEngine.Random.iye. Ṣe ina awọn nọmba konge ẹyọkan (floats) ni sakani lati [0; 1).
  5. Unity.Mathematics.Random.NextFloat (). Apá ti titun Unity.Mathematics ìkàwé. Ṣe ipilẹṣẹ awọn nọmba konge ẹyọkan (fofo) ni iwọn ti a fun ni awọn iye.

Fere nibi gbogbo ninu iwe ti a pato pinpin aṣọ, pẹlu awọn sile ti UnityEngine.Random.value (ibi ti awọn pinpin a ti ko pato, sugbon ni apéerẹìgbìyànjú pẹlu UnityEngine.Random.Range () aṣọ ti a tun ti ṣe yẹ) ati Unity.Mathematics.Random. .NextFloat () (ibi ti o wa ni ipilẹ ni algorithm xorshift, eyi ti o tumọ si pe lẹẹkansi o nilo lati duro fun pinpin iṣọkan).

Nipa aiyipada, awọn abajade ti a nireti ni a mu bi awọn ti a pato ninu iwe.

Ilana

A kowe ohun elo kekere kan ti o ṣe ipilẹṣẹ awọn lẹsẹsẹ ti awọn nọmba laileto nipa lilo ọkọọkan awọn ọna ti a gbekalẹ ati fipamọ awọn abajade fun sisẹ siwaju.

Awọn ipari ti ọkọọkan kọọkan jẹ awọn nọmba 100.
Ibiti o ti awọn nọmba ID jẹ [0, 100).

A gba data lati awọn iru ẹrọ ibi-afẹde pupọ:

  • Windows
    - Isokan v2018.3.14f1, Ipo Olootu, Mono, .NET Standard 2.0
  • MacOS
    - Isokan v2018.3.14f1, Ipo Olootu, Mono, .NET Standard 2.0
    - isokan v5.6.4p4, Olootu mode, Mono, .NET Standard 2.0
  • Android
    - isokan v2018.3.14f1, kọ fun ẹrọ, Mono, .NET Standard 2.0
  • iOS
    - isokan v2018.3.14f1, kọ fun ẹrọ, il2cpp, .NET Standard 2.0

Imuse

A ni ọpọlọpọ awọn ọna oriṣiriṣi lati ṣe ina awọn nọmba laileto. Fun ọkọọkan wọn, a yoo kọ kilasi ipari ti o yatọ, eyiti o yẹ ki o pese:

  1. O ṣeeṣe lati ṣeto iwọn awọn iye [min/max). Yoo wa ni ṣeto nipasẹ awọn Constructor.
  2. Ọna ti o pada MF. Jẹ ki a yan leefofo bi iru, bi o ṣe jẹ gbogbogbo.
  3. Orukọ ọna iran fun siṣamisi awọn abajade. Fun irọrun, a yoo pada bi iye kan orukọ kikun ti kilasi + orukọ ọna ti a lo lati ṣe ipilẹṣẹ MF.

Ni akọkọ, jẹ ki a kede abstraction kan ti yoo jẹ aṣoju nipasẹ wiwo IrandomGenerator:

namespace RandomDistribution
{
    public interface IRandomGenerator
    {
        string Name { get; }

        float Generate();
    }
}

Imuse ti System.Random.Next()

Ọna yii ngbanilaaye lati ṣeto iwọn awọn iye, ṣugbọn o da awọn nọmba pada, ṣugbọn awọn floats nilo. O le nirọrun tumọ odidi bi leefofo loju omi, tabi o le faagun iwọn awọn iye nipasẹ ọpọlọpọ awọn aṣẹ titobi, sanpada wọn pẹlu iran kọọkan ti aarin. Abajade yoo jẹ nkan bi aaye ti o wa titi pẹlu aṣẹ ti a fun ni deede. A yoo lo aṣayan yii nitori pe o sunmọ si iye oju omi oju omi gidi.

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;
    }
}

Imuse ti System.Random.NextDouble()

Nibi ibiti o wa titi ti awọn iye [0; 1). Lati ṣe akanṣe rẹ sori eyi ti a sọ pato ninu olupilẹṣẹ, a lo isiro ti o rọrun: 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;
    }
}

Imuse ti UnityEngine.Random.Range()

Ọna yii ti UnityEngine.Random aimi kilasi gba ọ laaye lati ṣeto ọpọlọpọ awọn iye ati dapada iru iru leefofo kan. O ko ni lati ṣe eyikeyi awọn iyipada afikun.

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);
    }
}

Imuse ti UnityEngine.Random.iye

Ohun-ini iye ti kilasi aimi UnityEngine.Random da pada iru leefofo loju omi lati ibiti o wa titi ti awọn iye [0; 1). Jẹ ki ká ise agbese o pẹlẹpẹlẹ a fi fun ibiti ni ni ọna kanna bi nigba ti imulo 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;
    }
}

Imuse ti Isokan.Mathematics.Random.NextFloat()

Ọna NextFloat () ti Unity.Mathematics.Random kilasi pada aaye lilefoofo ti iru leefofo loju omi ati ki o gba ọ laaye lati pato awọn iye ti o pọju. Iyatọ kan ṣoṣo ni pe apẹẹrẹ kọọkan ti Unity.Mathematics.Random yoo ni lati ṣe ipilẹṣẹ pẹlu awọn irugbin diẹ - ni ọna yii a yoo yago fun ṣiṣẹda awọn ilana atunwi.

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);
    }
}

Imuse ti MainController

Ọpọlọpọ awọn imuṣẹ ti IRandomGenerator ti ṣetan. Nigbamii, o nilo lati ṣe ina awọn ilana ati ṣafipamọ data ti abajade fun sisẹ. Lati ṣe eyi, a yoo ṣẹda aaye kan ati iwe afọwọkọ MainController kekere ni Isokan, eyiti yoo ṣe gbogbo iṣẹ pataki ati ni akoko kanna jẹ iduro fun ibaraenisepo pẹlu UI.

Jẹ ki a ṣeto iwọn ti dataset ati sakani ti awọn iye MF, ati tun gba ọna ti o da ọpọlọpọ awọn olupilẹṣẹ ti tunto ati ṣetan lati ṣiṣẹ.

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)
            };
        }

        ...
    }
}

Bayi jẹ ki a ṣẹda dataset. Ni ọran yii, iran data yoo ni idapo pẹlu gbigbasilẹ awọn abajade sinu ṣiṣan ọrọ kan (ni ọna kika csv). Lati tọju awọn iye ti IRandomGenerator kọọkan, a ti pin iwe ti ara rẹ, ati laini akọkọ ni Orukọ monomono naa.

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();
            }
        }

        ...
    }
}

Gbogbo ohun ti o ku ni lati pe ọna GenerateCsvDataSet ati fi abajade pamọ si faili kan, tabi gbe data lẹsẹkẹsẹ sori nẹtiwọki lati ẹrọ ipari si olupin gbigba.

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();
            }
        }

        ...
    }
}

Awọn orisun ise agbese wa ni GitLab.

Результаты

Ko si iyanu sele. Ohun ti wọn nireti ni ohun ti wọn gba - ni gbogbo awọn ọran, pinpin paapaa laisi ofiri ti awọn iditẹ. Emi ko rii aaye ni fifi awọn aworan lọtọ fun awọn iru ẹrọ - gbogbo wọn ṣafihan isunmọ awọn abajade kanna.

Otitọ ni:
BlessRNG tabi ṣayẹwo RNG fun ododo

Wiwo awọn ilana lori ọkọ ofurufu lati gbogbo awọn ọna iran marun:
BlessRNG tabi ṣayẹwo RNG fun ododo

Ati iworan ni 3D. Emi yoo fi abajade System.Random.Next () silẹ nikan ki o má ba ṣe agbejade opo ti akoonu kanna.
BlessRNG tabi ṣayẹwo RNG fun ododo

Itan ti a sọ ni ifihan nipa pinpin deede ti UnityEngine.Random ko tun ṣe funrararẹ: boya o jẹ aṣiṣe lakoko, tabi nkankan ti yipada ninu ẹrọ naa. Ṣugbọn nisisiyi a ni idaniloju.

orisun: www.habr.com

Fi ọrọìwòye kun