Ropafadza RNG kana kutarisa iyo RNG yekururama

Ropafadza RNG kana kutarisa iyo RNG yekururama

Mukuvandudzwa kwemutambo, iwe kazhinji unofanirwa kusunga chimwe chinhu nekusarongeka: Kubatana kune yayo Random yeizvi, uye mukuenderana nayo kune System.Random. Pane imwe nguva, pane imwe yemapurojekiti, ndakawana fungidziro yekuti ese ari maviri anogona kushanda zvakasiyana (kunyangwe achifanirwa kuve nekugovaniswa).

Ipapo havana kupinda mune zvakadzama - zvaive zvakakwana kuti shanduko kuenda kuSystem.Random yakagadzirisa matambudziko ese. Iye zvino takasarudza kutarisa mairi zvakadzama uye kuita tsvakiridzo shoma: "kurerekera" kana kufanofungidzira maRNGs, uye ndeipi yekusarudza. Uyezve, ndakanzwa kanopfuura kamwechete kunzwa maonero anopokana nezve "kutendeseka" kwavo - ngatiedze kufunga kuti mhedzisiro chaiyo inofananidzwa sei neyakaziviswa.

Pfupi chirongwa chedzidzo kana RNG iri chaizvo RNG

Kana iwe uchitojairana nemajenareta enhamba dzisina kujairika, saka unogona kusvetuka kuenda kuchikamu che "Kuedza".

Nhamba dzisina kujairika (RN) inotevedzana yenhamba dzakagadzirwa uchishandisa imwe random (chaotic) process, sosi ye entropy. Ndiko kuti, iyi inotevedzana ine zvinhu zvisingabatanidzwe nechero mutemo wemasvomhu - hazvina chikonzero-uye-mhedzisiro hukama.

Chii chinogadzira nhamba isina kujairika inonzi random number generator (RNG). Zvingaite sekunge zvese ndezvekutanga, asi kana tikatama kubva kudzidziso kuenda kukudzidzira, saka hazvo hazvisi nyore kushandisa software algorithm yekugadzira kutevedzana kwakadaro.

Chikonzero chiri mukusavapo kwemhirizhonga imwe chete mumagetsi emazuva ano evatengi. Pasina iyo, nhamba dzisina kujairika dzinorega kuve dzisina kurongeka, uye jenareta yadzo inoshanduka kuita yakajairika basa rekupokana kwakatsanangurwa zviri pachena. Kune akati wandei ehunyanzvi mumunda weIT, iyi idambudziko rakakura (semuenzaniso, cryptography), asi kune vamwe kune mhinduro inogamuchirwa zvachose.

Izvo zvinodikanwa kunyora algorithm iyo yaizodzoka, kunyangwe isiri nhamba chaiyo, asi padyo nepavanogona napo kwavari - iyo inonzi pseudo-random nhamba (PRN). Iyo algorithm mune iyi kesi inonzi pseudorandom nhamba jenareta (PRNG).

Pane akati wandei sarudzo dzekugadzira PRNG, asi zvinotevera zvichave zvakakosha kune wese munhu:

  1. Kudiwa kwekutanga kutanga.

    Iyo PRNG haina kunobva entropy, saka inofanirwa kupihwa yekutanga nyika isati yashandiswa. Inotsanangurwa senhamba (kana vector) uye inonzi mhodzi (mbeu isina kujairika). Kazhinji, processor clock counter kana nhamba yakaenzana yenguva system inoshandiswa sembeu.

  2. Sequence reproducibility.

    Iyo PRNG inonyatso deterministic, saka mhodzi inotsanangurwa panguva yekutanga inosarudzika iyo yese yeramangwana kutevedzana kwenhamba. Izvi zvinoreva kuti PRNG yakaparadzana yakatangwa nemhodzi imwechete (panguva dzakasiyana, muzvirongwa zvakasiyana, pamidziyo yakasiyana) inoburitsa kutevedzana kwakafanana.

Iwe zvakare unofanirwa kuziva iyo mukana wekugovera inoratidza iyo PRNG - ndeapi manhamba ayo achagadzira uye neicho mukana. Kazhinji kazhinji uku kungave kugovera kwakajairika kana kugovera kwakafanana.
Ropafadza RNG kana kutarisa iyo RNG yekururama
Kugovera kwakajairika (kuruboshwe) uye kugovera yunifomu (kurudyi)

Ngatitii tine kufa kwakanaka nemativi makumi maviri nemana. Kana ukaikanda, mukana wekuwana imwe unenge wakaenzana ne24/1 (zvakafanana nemukana wekuwana chero imwe nhamba). Kana iwe ukaita kukanda kwakawanda uye kurekodha mhedzisiro, iwe unozoona kuti mipendero yese inodonha neinenge yakafanana frequency. Chaizvoizvo, iyi inofa inogona kutorwa seRNG ine yunifomu kugovera.

Ko kana ukakanda gumi remadhayi aya kamwechete woverenga mapoinzi ese? Kufanana kuchachengetedzwa here? Aihwa. Kazhinji kazhinji, mari yacho ichave iri pedyo ne10 points, kureva, kune imwe avhareji kukosha. Uye semhedzisiro, kunyangwe usati waita kukanda, unogona kufungidzira mhedzisiro yeramangwana.

Chikonzero ndechekuti kune huwandu hukuru hwemasanganiswa kuti uwane avhareji mamakisi. Iyo iri kure kubva pairi, iyo misanganiswa mishoma - uye, maererano, yakaderera mukana wekurasikirwa. Kana iyi data ikaonekwa, inongofanana nechimiro chebhero. Naizvozvo, nekumwe kutambanudza, hurongwa hwegumi dice inogona kunzi RNG ine yakajairika kugovera.

Mumwe muenzaniso, nguva ino chete mundege - kupfura pane chinangwa. Mupfuri anenge ari RNG inogadzira nhamba mbiri (x, y) inoratidzwa pagirafu.
Ropafadza RNG kana kutarisa iyo RNG yekururama
Bvumiranai kuti sarudzo kuruboshwe iri padyo nehupenyu chaihwo - iyi iRNG ine yakajairika kugovera. Asi kana iwe uchida kuparadzira nyeredzi mudenga rakasviba, saka sarudzo yakakodzera, yakawanikwa uchishandisa RNG nekugovera yunifomu, inokodzera zviri nani. Kazhinji, sarudza jenareta zvichienderana nebasa riripo.

Zvino ngatitaure nezve entropy yePNG kutevedzana. Semuenzaniso, pane kutevedzana kunotanga seizvi:

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

Nhamba idzi dzinongoitika sei pakutanga kuona? Ngatitange nekutarisa kugovera.
Ropafadza RNG kana kutarisa iyo RNG yekururama
Inotaridzika padhuze neyunifomu, asi kana iwe ukaverenga kutevedzana kwenhamba mbiri wodzidudzira semarongedzero mundege, unowana izvi:
Ropafadza RNG kana kutarisa iyo RNG yekururama
Mapeteni anoonekwa zvakajeka. Uye sezvo iyo data iri mukutevedzana yakarongedzerwa neimwe nzira (kureva, ine yakaderera entropy), izvi zvinogona kupa iyo iyo chaiyo "kusarura". Pashoma, PRNG yakadaro haina kunyatsokodzera kugadzira marongero mundege.

Imwe kutevedzana:

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

Zvese zvinoita kunge zvakanaka pano kunyangwe mundege:
Ropafadza RNG kana kutarisa iyo RNG yekururama
Ngatitarisei muhuwandu (verenga nhamba nhatu panguva):
Ropafadza RNG kana kutarisa iyo RNG yekururama
Uye zvakare maitiro. Hazvichagoneki kugadzira chitarisiko mumativi mana. Asi mapatani anogona kuvapo pachiyero ichi uye pane makuru.

Mune cryptography, apo zvinonyanya kuomesesa zvinodiwa zvinoiswa paPRNGs, mamiriro akadai haagamuchirwe zvachose. Naizvozvo, algorithms akakosha akagadzirwa kuti aongorore mhando yavo, yatisingazobata pairi ikozvino. Musoro wenyaya wakakura uye unofanirwa nechinyorwa chakasiyana.

Kuedza

Kana isu tisingazivi chimwe chinhu zvechokwadi, saka tingashanda sei nacho? Zvakakosha here kuyambuka mugwagwa kana usingazivi kuti robhoti ripi rinobvumira? Migumisiro inogona kunge yakasiyana.

Izvo zvakafanana zvinoenda kune inotorious randomness muUnity. Zvakanaka kana zvinyorwa zvichiratidza zvinodikanwa, asi nyaya yataurwa pakutanga kwechinyorwa chakaitika chaizvo nekuda kwekushaikwa kwezvaidiwa.

Uye kana iwe usingazive kuti chishandiso chinoshanda sei, haugone kuchishandisa nemazvo. Kazhinji, nguva yasvika yekutarisa uye kuitisa kuyedza kuti pakupedzisira uve nechokwadi kana nezve kugovera.

Mhinduro yacho yaive nyore uye inoshanda - unganidza manhamba, tora chinangwa data uye tarisa mhinduro.

Chidzidzo chekudzidza

Pane nzira dzinoverengeka dzekugadzira nhamba dzisina kurongeka muUnity - takaedza shanu.

  1. System.Random.Next(). Inogadzira ma integers muhuwandu hwakapihwa hwehukoshi.
  2. System.Random.NextDouble(). Inogadzira nhamba dzakapetwa kaviri muhuwandu kubva [0; 1).
  3. UnityEngine.Random.Range(). Inogadzira nhamba dzechokwadi imwechete (inoyangarara) muhuwandu hwakapihwa hwehuwandu.
  4. UnityEngine.Random.value. Inogadzira nhamba dzechokwadi imwechete (inoyangarara) muchikamu kubva [0; 1).
  5. Kubatana.Mathematics.Random.NextFloat(). Chikamu cheraibhurari itsva yeUnity.Mathematics. Inogadzira nhamba dzechokwadi imwechete (inoyangarara) muhuwandu hwakapihwa hwehuwandu.

Kunenge kwese kwese kwegwaro kugoverwa kwakafanana kwakatsanangurwa, kunze kweUnityEngine.Random.value (apo kugoverwa kwakanga kusina kutaurwa, asi nekuenzanisa neUnityEngine.Random.Range() yunifomu yaitarisirwawo) uye Unity.Mathematics.Random. .NextFloat() (papi muNhasi ndiyo xorshift algorithm, zvinoreva kuti zvakare unofanira kumirira kugoverwa kweyunifomu).

Nekusagadzika, mhedzisiro yaitarisirwa yakatorwa seyakatsanangurwa muzvinyorwa.

Maitiro

Isu takanyora diki application iyo yakagadzira kutevedzana kwenhamba dzisina kurongeka tichishandisa imwe neimwe yenzira dzakaratidzwa uye takachengeta mibairo yekuenderera mberi nekugadzirisa.

Kureba kwekutevedzana kwega kwega i100 nhamba.
Huwandu hwenhamba dzisina kurongeka ndedze [0, 100).

Data yakaunganidzwa kubva kumapuratifomu akati wandei:

  • Windows
    - Kubatana v2018.3.14f1, Editor mode, Mono, .NET Standard 2.0
  • macOS
    - Kubatana v2018.3.14f1, Editor mode, Mono, .NET Standard 2.0
    - Kubatana v5.6.4p4, Editor mode, Mono, .NET Standard 2.0
  • Android
    - Kubatana v2018.3.14f1, kuvaka pamudziyo, Mono, .NET Standard 2.0
  • iOS
    - Kubatana v2018.3.14f1, kuvaka pamudziyo, il2cpp, .NET Standard 2.0

Kutevedzera

Tine nzira dzakasiyana siyana dzekugadzira nhamba dzisina kurongeka. Kune mumwe nemumwe wavo, isu tichanyora yakaparadzana wrapper kirasi, iyo inofanirwa kupa:

  1. Kugona kuseta huwandu hwehuwandu [min/max). Ichagadziriswa kuburikidza nemugadziri.
  2. Nzira yekudzorera MF. Ngatisarudzei kuyangarara semhando, sezvo iri yakawanda.
  3. Zita renzira yechizvarwa yekumaka zvabuda. Kuti zvive nyore, isu tichadzoka semutengo zita rakazara rekirasi + zita renzira inoshandiswa kugadzira iyo MF.

Kutanga, ngatizivise chidimbu chinozomiririrwa neIRandomGenerator interface:

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

        float Generate();
    }
}

Kuitwa kweSystem.Random.Next()

Iyi nzira inokubvumira kuti uise huwandu hwehutsika, asi inodzorera nhamba, asi inoyangarara inodiwa. Iwe unogona kungodudzira nhamba seyangarara, kana iwe unogona kuwedzera huwandu hwehutsika neanoverengeka maodha ehukuru, uchivabhadhara nechizvarwa chimwe nechimwe chepakati. Mhedzisiro ichava chinhu chakafanana neyakagadziriswa-nzvimbo ine yakapihwa kurongeka kwechokwadi. Isu tichashandisa iyi sarudzo sezvo iri padyo neiyo chaiyo float kukosha.

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

Kuitwa kweSystem.Random.NextDouble()

Pano iyo yakagadziriswa huwandu hwehutsika [0; 1). Kuigadzira pane iyo yakatsanangurwa muvaki, tinoshandisa arithmetic iri nyore: 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;
    }
}

Kuitwa kweUnityEngine.Random.Range()

Iyi nzira yeUnityEngine.Random static kirasi inobvumidza iwe kuseta huwandu hwehukoshi uye kudzosa rudzi rweyangarara. Iwe haufanirwe kuita chero shanduko yekuwedzera.

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

Kuitwa kweUnityEngine.Random.value

Iko kukosha kwechivako cheiyo static class UnityEngine.Random inodzosa rudzi rwekuyangarara kubva kune yakatarwa huwandu hwehukoshi[0; 1). Ngatizvirojedzei pachikamu chakapihwa nenzira imwechete sepakushandisa 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;
    }
}

Kuitwa kweUnity.Mathematics.Random.NextFloat()

Nzira yeNextFloat() yeUnity.Mathematics.Random kirasi inodzosa nzvimbo inoyangarara yemhando inoyangarara uye inokutendera kuti utaure huwandu hwehunhu. Chinhu chimwe chete ndechekuti chiitiko cheUnity.Mathematics.Random chinofanirwa kutangwa neimwe mhodzi - nenzira iyi tichadzivirira kuburitsa kudzokorora kutevedzana.

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

Kuitwa kweMainController

Kuitwa kwakawanda kweIRandomGenerator kwakagadzirira. Tevere, iwe unofanirwa kugadzira kutevedzana uye kuchengetedza inoguma dataset yekugadzirisa. Kuti tiite izvi, isu tichagadzira chiitiko uye diki MainController script muKubatana, iyo ichaita basa rose rinodiwa uye panguva imwe chete ine mutoro wekudyidzana neUI.

Ngatiisei saizi yedataset uye huwandu hwehuwandu hweMF, uye zvakare titore nzira inodzosa ruzhinji rwemajenareta akagadzirirwa uye akagadzirira kushanda.

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

        ...
    }
}

Zvino ngatigadzirirei dataset. Muchiitiko ichi, kugadzirwa kwedata kuchasanganiswa nekurekodha zvabuda murukova rwemavara (mune csv fomati). Kuti uchengetedze kukosha kweiyo yega IRandomGenerator, yayo yega koramu yakagoverwa, uye mutsara wekutanga une Zita rejenareta.

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

        ...
    }
}

Zvose zvinosara ndezvekudana nzira yeGenerateCsvDataSet uye chengetedza chigumisiro kune faira, kana kuti pakarepo tumira data pamusoro petiweki kubva kumudziyo wekupedzisira kuenda kune server inogamuchira.

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

        ...
    }
}

Zviwanikwa zveprojekiti zviri pa GitLab.

Mhinduro

Hapana chishamiso chakaitika. Zvavaitarisira ndizvo zvavakawana - muzviitiko zvese, kugovaniswa pasina kana zano rekurangana. Ini handisi kuona chinangwa chekuisa akaparadzana magirafu emapuratifomu - ese anoratidza anenge mhedzisiro yakafanana.

Chokwadi ndechekuti:
Ropafadza RNG kana kutarisa iyo RNG yekururama

Kuonekwa kwekutevedzana mundege kubva kune ese mashanu echizvarwa nzira:
Ropafadza RNG kana kutarisa iyo RNG yekururama

Uye kuona mu 3D. Ndichasiya chete mhedzisiro yeSystem.Random.Next() kuitira kuti usaburitse zvakawanda zvakafanana.
Ropafadza RNG kana kutarisa iyo RNG yekururama

Iyo nyaya yakataurwa munhanganyaya nezve kugovaniswa kwakajairika kweUnityEngine.Random haina kudzokorora pachayo: ingave yaive yakanganisa pakutanga, kana chimwe chinhu chachinja mujini. Asi zvino tine chokwadi.

Source: www.habr.com

Voeg