BlessRNG kapena kuyang'ana RNG kuti muchite chilungamo

BlessRNG kapena kuyang'ana RNG kuti muchite chilungamo

Pachitukuko cha masewera, nthawi zambiri mumafunika kumangiriza chinachake mwachisawawa: Umodzi uli ndi Random yake ya izi, ndipo mofanana ndi izo pali System.Random. Kalekale, pa imodzi mwama projekitiwo, ndidakhala ndi malingaliro akuti onse amatha kugwira ntchito mosiyana (ngakhale akuyenera kugawa).

Ndiye iwo sanalowe mwatsatanetsatane - zinali zokwanira kuti kusintha kwa System.Random kunakonza mavuto onse. Tsopano tinaganiza zoyang'ana mwatsatanetsatane ndikuchita kafukufuku pang'ono: momwe ma RNG "osakondera" kapena odziwikiratu alili, ndi omwe angasankhe. Komanso, ndamva kangapo malingaliro otsutsana pa "kukhulupirika" kwawo - tiyeni tiyese kulingalira momwe zotsatira zenizeni zikufananirana ndi zomwe zalengezedwa.

Pulogalamu yachidule yamaphunziro kapena RNG kwenikweni ndi RNG

Ngati mumadziwa kale majenereta a manambala mwachisawawa, ndiye kuti mutha kudumpha nthawi yomweyo kupita ku gawo la "Kuyesa".

Manambala osasintha (RN) ndi mndandanda wa manambala omwe amapangidwa pogwiritsa ntchito njira yachisawawa (chaotic), gwero la entropy. Ndiko kuti, izi ndizotsatizana zomwe zinthu zake sizimalumikizidwa ndi lamulo lililonse la masamu - alibe ubale woyambitsa-ndi-zotsatira.

Zomwe zimapanga nambala yachisawawa zimatchedwa random number generator (RNG). Zingawoneke ngati zonse ndi zoyambira, koma ngati tichoka ku chiphunzitso kupita kukuchita, ndiye kuti sizophweka kugwiritsa ntchito pulogalamu ya pulogalamu yopangira zotsatizanazi.

Chifukwa chagona kusowa kwa chisokonezo chomwechi mumagetsi amakono ogula. Popanda izo, manambala osadziwika amasiya kukhala mwachisawawa, ndipo jenereta yawo imasanduka ntchito wamba ya mikangano yodziwika bwino. Kwa akatswiri angapo mu gawo la IT, ili ndi vuto lalikulu (mwachitsanzo, cryptography), koma kwa ena pali yankho lovomerezeka kwathunthu.

Ndikofunikira kuti mulembe algorithm yomwe ingabwerere, ngakhale osati manambala mwachisawawa, koma pafupi kwambiri ndi iwo - otchedwa manambala achinyengo (PRN). Algorithm pankhaniyi imatchedwa pseudorandom number generator (PRNG).

Pali zosankha zingapo zopangira PRNG, koma zotsatirazi zidzakhala zofunikira kwa aliyense:

  1. Kufunika koyambira koyambirira.

    PRNG ilibe gwero la entropy, chifukwa chake iyenera kupatsidwa gawo loyamba musanagwiritse ntchito. Imatchulidwa ngati nambala (kapena vector) ndipo imatchedwa mbewu (mbewu yachisawawa). Nthawi zambiri, chowerengera cha wotchi ya processor kapena nambala yofananira ndi nthawi yamakina imagwiritsidwa ntchito ngati mbewu.

  2. Kuchulukirachulukira.

    PRNG ndi yotsimikiza kwathunthu, kotero mbewu yomwe idatchulidwa poyambitsa imadziwonetsera mwapadera mndandanda wonse wamtsogolo wa manambala. Izi zikutanthauza kuti PRNG yosiyana yokhazikitsidwa ndi mbewu yomweyo (nthawi zosiyanasiyana, m'mapulogalamu osiyanasiyana, pazida zosiyanasiyana) idzapanga mndandanda womwewo.

Muyeneranso kudziwa kugawa komwe kumadziwika ndi PRNG - manambala omwe angapange komanso mwayi wotani. Nthawi zambiri izi zimakhala kugawa kwabwinobwino kapena kugawa kofanana.
BlessRNG kapena kuyang'ana RNG kuti muchite chilungamo
Kugawa kwanthawi zonse (kumanzere) ndi kugawa kofanana (kumanja)

Tinene kuti tili ndi kufa koyenera ndi mbali 24. Ngati mutayiponya, mwayi wopeza imodzi udzakhala wofanana ndi 1/24 (chimodzimodzi ndi mwayi wopeza nambala ina iliyonse). Ngati muponya zambiri ndikulemba zotsatira, mudzawona kuti m'mphepete mwake mumatuluka pafupifupi ma frequency ofanana. Kwenikweni, kufa uku kumatha kuonedwa ngati RNG yokhala ndi magawo ofanana.

Bwanji ngati mutaponya 10 mwa dayisi nthawi imodzi ndikuwerengera mapointi onse? Kodi kugwirizana kudzasungidwa kwa izo? Ayi. Nthawi zambiri, ndalamazo zimakhala pafupi ndi mfundo 125, ndiye kuti, pamtengo wapakati. Ndipo zotsatira zake, ngakhale musanaponye, ​​mutha kuyerekeza zotsatira zamtsogolo.

Chifukwa chake ndi chakuti pali kuchuluka kwakukulu kophatikizika kuti mupeze kuchuluka kwapakati. Kutalikirapo, kuphatikizika kocheperako - ndipo, motero, kumachepetsa mwayi wotayika. Ngati izi zikuwonetsedwa, zidzafanana ndi mawonekedwe a belu. Choncho, ndi kutambasula kwina, dongosolo la 10 dice likhoza kutchedwa RNG ndi kugawa bwino.

Chitsanzo china, nthawi ino pa ndege - kuwombera chandamale. Wowomberayo adzakhala RNG yomwe imapanga nambala ziwiri (x, y) zomwe zikuwonetsedwa pa graph.
BlessRNG kapena kuyang'ana RNG kuti muchite chilungamo
Gwirizanani kuti njira yomwe ili kumanzere ili pafupi ndi moyo weniweni - iyi ndi RNG yogawidwa bwino. Koma ngati mukufuna kufalitsa nyenyezi mumdima wakuda, ndiye kuti njira yoyenera, yomwe imapezeka pogwiritsa ntchito RNG ndi kugawa yunifolomu, ndiyoyenera. Nthawi zambiri, sankhani jenereta kutengera ntchito yomwe muli nayo.

Tsopano tiyeni tiyankhule za entropy ya mndandanda wa PNG. Mwachitsanzo, pali mndandanda womwe umayamba motere:

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

Kodi manambala awa amangowoneka bwanji koyamba? Tiyeni tiyambe ndi kuyang'ana kugawa.
BlessRNG kapena kuyang'ana RNG kuti muchite chilungamo
Zikuwoneka pafupi ndi yunifolomu, koma ngati muwerenga mndandanda wa manambala awiri ndikutanthauzira ngati makonzedwe a ndege, mumapeza izi:
BlessRNG kapena kuyang'ana RNG kuti muchite chilungamo
Zitsanzo zimawonekera bwino. Ndipo popeza deta yomwe ikutsatiridwayo imayendetsedwa mwanjira inayake (ndiko kuti, ili ndi entropy yotsika), izi zingayambitse "kukondera" komweko. Pang'ono ndi pang'ono, PRNG yotereyi si yoyenera kwambiri kupanga zogwirizanitsa pa ndege.

Kutsatira kwina:

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

Chilichonse chikuwoneka bwino pano ngakhale pa ndege:
BlessRNG kapena kuyang'ana RNG kuti muchite chilungamo
Tiyeni tiwone kuchuluka kwake (werengani manambala atatu nthawi imodzi):
BlessRNG kapena kuyang'ana RNG kuti muchite chilungamo
Ndipo kachiwiri mapatani. Sizingathekenso kupanga chithunzithunzi mu miyeso inayi. Koma zitsanzo zimatha kukhalapo pamlingo uwu komanso pazikuluzikulu.

Mu cryptography, pomwe zofunikira kwambiri zimayikidwa pa PRNGs, izi ndizosavomerezeka. Chifukwa chake, ma aligorivimu apadera apangidwa kuti awone momwe alili, omwe sitikhudzapo tsopano. Mutuwu ndi waukulu ndipo uyenera kukhala ndi nkhani ina.

Kuyesa

Ngati sitikudziwa kanthu motsimikiza, ndiye tingagwire ntchito bwanji? Ndikoyenera kuwoloka msewu ngati simukudziwa kuti ndi magetsi ati omwe amalola? Zotsatira zake zingakhale zosiyana.

Zomwezo zimapitanso ndi mbiri yodziwika bwino mu Unity. Ndi bwino ngati zolembazo zikuwonetsa zofunikira, koma nkhani yomwe yatchulidwa kumayambiriro kwa nkhaniyi inachitika ndendende chifukwa chosowa zofunikira.

Ndipo ngati simukudziwa momwe chidacho chimagwirira ntchito, simungathe kuchigwiritsa ntchito moyenera. Nthawi zambiri, nthawi yakwana yoti mufufuze ndikuyesa kuyesa kuti mutsimikizire za kugawa.

Yankho lake linali losavuta komanso lothandiza - sonkhanitsani ziwerengero, pezani deta ya zolinga ndikuyang'ana zotsatira.

Nkhani yophunzira

Pali njira zingapo zopangira manambala mwachisawawa mu Unity - tidayesa zisanu.

  1. System.Random.Next(). Amapanga manambala mumitundu yosiyanasiyana.
  2. System.Random.NextDouble(). Amapanga manambala olondola kawiri kuchokera pa [0; 1).
  3. UnityEngine.Random.Range(). Amapanga manambala olondola amodzi (amayandama) mumitundu yosiyanasiyana.
  4. UnityEngine.Random.value. Amapanga manambala olondola amodzi (amayandama) kuchokera pa [0; 1).
  5. Unity.Mathematics.Random.NextFloat(). Gawo la laibulale yatsopano ya Unity.Mathematics. Amapanga manambala olondola amodzi (amayandama) mumitundu yosiyanasiyana.

Pafupifupi paliponse m'zolembedwa kugawidwa kofanana kunatchulidwa, kupatulapo UnityEngine.Random.value (komwe kugawa sikunatchulidwe, koma ndi kufanana ndi UnityEngine.Random.Range() yunifolomu inalinso kuyembekezera) ndi Unity.Mathematics.Random .NextFloat() (komwe mu Maziko ndi xorshift algorithm, zomwe zikutanthauza kuti muyeneranso kudikirira kugawa kofanana).

Mwachisawawa, zotsatira zoyembekezeredwa zidatengedwa ngati zomwe zafotokozedwa muzolemba.

Njira

Tinalemba ntchito yaying'ono yomwe idapanga manambala otsatizana mwachisawawa pogwiritsa ntchito njira iliyonse yomwe yaperekedwa ndikusunga zotsatira kuti zipitirire.

Kutalika kwa mndandanda uliwonse ndi manambala 100.
Chiwerengero cha manambala mwachisawawa ndi [0, 100).

Deta idasonkhanitsidwa kuchokera pamapulatifomu angapo omwe amatsata:

  • Windows
    - Unity v2018.3.14f1, Editor mode, Mono, .NET Standard 2.0
  • macOS
    - Unity v2018.3.14f1, Editor mode, Mono, .NET Standard 2.0
    - Umodzi v5.6.4p4, Mkonzi mode, Mono, .NET Standard 2.0
  • Android
    - Unity v2018.3.14f1, kumanga pa chipangizo, Mono, .NET Standard 2.0
  • iOS
    - Unity v2018.3.14f1, kumanga pa chipangizo, il2cpp, .NET Standard 2.0

Реализация

Tili ndi njira zingapo zopangira manambala mwachisawawa. Kwa aliyense wa iwo, tilemba kalasi ya wrapper yosiyana, yomwe iyenera kupereka:

  1. Kuthekera kokhazikitsa mitundu ingapo [min/max] Idzakhazikitsidwa ndi wopanga.
  2. Njira yobwezera MF. Tiyeni tisankhe zoyandama monga mtundu, monga momwe zimakhalira.
  3. Dzina la m'badwo njira yolembera zotsatira. Kuti zitheke, tidzabwezera monga mtengo dzina lonse la kalasi + dzina la njira yomwe imagwiritsidwa ntchito popanga MF.

Choyamba, tiyeni tilengeze zachidule chomwe chidzayimilidwe ndi mawonekedwe a IRandomGenerator:

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

        float Generate();
    }
}

Kukhazikitsa kwa System.Random.Next()

Njirayi imakulolani kuti muyike miyeso yambiri, koma imabwezera nambala, koma zoyandama ndizofunikira. Mutha kutanthauzira chiwerengero chonse ngati choyandama, kapena mutha kukulitsa kuchuluka kwamitengo ndi maulamuliro angapo, ndikulipira m'badwo uliwonse wapakatikati. Chotsatiracho chidzakhala chinachake chonga malo okhazikika ndi dongosolo loperekedwa lolondola. Tidzagwiritsa ntchito njirayi popeza ili pafupi ndi mtengo weniweni woyandama.

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

Kukhazikitsa kwa System.Random.NextDouble()

Pano pali mitundu yokhazikika [0; 1). Kuti tichite izi pa zomwe zafotokozedwa mwa omanga, timagwiritsa ntchito masamu osavuta: 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;
    }
}

Kukhazikitsa UnityEngine.Random.Range()

Njira iyi ya UnityEngine.Random static kalasi imakulolani kuti muyike zikhalidwe zingapo ndikubweza mtundu woyandama. Simukuyenera kuchita zina zosintha.

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

Kukhazikitsa kwa UnityEngine.Random.value

Mtengo wamtengo wapatali wa static class UnityEngine.Random umabweretsanso mtundu woyandama kuchokera pamitundu yokhazikika[0; 1). Tiyeni tiyipange pagulu lomwe laperekedwa mofanana ndi momwe tikugwiritsira ntchito 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;
    }
}

Kukhazikitsa Unity.Mathematics.Random.NextFloat()

Njira ya NextFloat() ya kalasi ya Unity.Mathematics.Random imabwezera malo oyandama amtundu woyandama ndikukulolani kuti mutchule mitundu ingapo. Chokhachokha ndikuti gawo lililonse la Unity.Mathematics.Mwachisawawa liyenera kuyambitsidwa ndi mbewu ina - mwanjira iyi tidzapewa kubwereza kubwereza.

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

Kukhazikitsa MainController

Zochita zingapo za IRandomGenerator zakonzeka. Chotsatira, muyenera kupanga zotsatizana ndikusunga zomwe zachitika kuti zisinthidwe. Kuti tichite izi, tidzapanga zochitika ndi script yaing'ono ya MainController mu Umodzi, yomwe idzachita ntchito zonse zofunika komanso nthawi yomweyo kukhala ndi udindo wogwirizana ndi UI.

Tiyeni tiyike kukula kwa dataset ndi kuchuluka kwa ma MF, komanso tipeze njira yomwe imabweretsanso majenereta angapo okonzedwa komanso okonzeka kugwira ntchito.

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

        ...
    }
}

Tsopano tiyeni tipange dataset. Pachifukwa ichi, kupanga deta kudzaphatikizidwa ndikujambula zotsatira mumtundu wa malemba (mu mtundu wa csv). Kuti musunge zikhalidwe za IRandomGenerator iliyonse, gawo lake losiyana limaperekedwa, ndipo mzere woyamba uli ndi Dzina la jenereta.

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

        ...
    }
}

Zomwe zatsala ndikuyitanitsa njira ya GenerateCsvDataSet ndikusunga zotsatira ku fayilo, kapena kusamutsa nthawi yomweyo deta pamaneti kuchokera pa chipangizo chomaliza kupita ku seva yolandila.

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

        ...
    }
}

Magwero a polojekiti ali pa GitLab.

Zotsatira

Palibe chozizwitsa chimene chinachitika. Zomwe amayembekeza ndi zomwe adapeza - nthawi zonse, kugawidwa kopanda chiwembu. Sindikuwona cholinga choyika ma graph osiyana pamapulatifomu - onse amawonetsa zotsatira zofanana.

Zoona zake n’zakuti:
BlessRNG kapena kuyang'ana RNG kuti muchite chilungamo

Kuwona zotsatizana pa ndege kuchokera ku njira zonse za mibadwo isanu:
BlessRNG kapena kuyang'ana RNG kuti muchite chilungamo

Ndipo mawonekedwe a 3D. Ndingosiya zotsatira za System.Random.Next() kuti ndisapange mulu wa zinthu zofanana.
BlessRNG kapena kuyang'ana RNG kuti muchite chilungamo

Nkhaniyi idanenedwa kumayambiriro kwa kugawa kwabwino kwa UnityEngine. Mwachisawawa sichinabwerezenso: mwina poyamba inali yolakwika, kapena china chake chasintha mu injini. Koma tsopano ndife otsimikiza.

Source: www.habr.com

Kuwonjezera ndemanga