BlessRNG pe siaki le RNG mo le saʻo

BlessRNG pe siaki le RNG mo le saʻo

I le atinaʻeina o taʻaloga, e masani ona e manaʻomia e faʻapipiʻi se mea i se mea faʻafuaseʻi: O loʻo i ai i le Unity lona lava Random mo lenei mea, ma e tutusa ma ia o loʻo i ai System.Random. I se tasi taimi, i luga o se tasi o galuega faatino, na ou maua ai le lagona e mafai uma ona galulue eseese (e ui lava e tatau ona tutusa le tufatufaina).

Ona latou le'i alu lea i auiliiliga - ua lava na o le suiga i le System.Random na faasa'o ai faafitauli uma. O lea la na matou filifili e vaʻavaʻai atili i ai ma faia sina suʻesuʻega: pe faʻafefea ona "faʻaituau" poʻo le vaʻaia o RNGs, ma o le fea e filifili. E le gata i lea, e sili atu ma le tasi le taimi na ou faʻalogo ai i manatu feteʻenaʻi e uiga i lo latou "faʻamaoni" - seʻi o tatou taumafai e iloa pe faʻapefea ona faʻatusatusa iʻuga moni ma mea na faʻaalia.

Polokalama aʻoaʻoga puupuu poʻo le RNG o le RNG moni lava

Afai ua uma ona e masani i numera faʻasolosolo, ona mafai loa lea ona e faaseʻe i le vaega "Suʻega".

Numera fa'afuase'i (RN) o se fa'asologa o fuainumera fa'atupuina e fa'aaoga ai se fa'agasologa fa'afuase'i (gaogao), o se puna o le entropy. O lona uiga, o se fa'asologa lea o ona elemene e le feso'ota'i i so'o se tulafono fa'a-matematika - e leai se va'aiga mafua-ma-a'afiaga.

O le mea e fatuina ai le numera faʻafuaseʻi e taʻua o le numera faʻasolosolo (RNG). E foliga mai o mea uma lava e tulagalua, ae afai tatou te siitia mai le aʻoaʻoga i le faʻataʻitaʻiga, o le mea moni e le faigofie tele le faʻatinoina o se algorithm software mo le fausiaina o se faʻasologa.

O le mafuaʻaga o loʻo taoto i le leai o lena lava vevesi i mea tau eletise faʻaonaponei. A aunoa ma lena, o numera faʻafuaseʻi e le toe faʻafuaseʻi, ma o latou afi e liua i se galuega masani o finauga manino. Mo le tele o faʻapitoa i le IT, o se faʻafitauli ogaoga lea (mo se faʻataʻitaʻiga, cryptography), ae mo isi o loʻo i ai se tali taliaina atoatoa.

E manaʻomia le tusia o se algorithm e toe foʻi mai, e ui lava e le o ni numera faʻafuaseʻi, ae e latalata i latou - o le numera pseudo-random numera (PRN). O le algorithm i lenei tulaga ua taʻua o le pseudorandom numera generator (PRNG).

E tele filifiliga mo le fatuina o se PRNG, ae o mea nei e talafeagai mo tagata uma:

  1. Le manaʻomia mo le faʻauluina muamua.

    O le PRNG e leai se puna o le entropy, o lea e tatau ona tuʻuina atu se tulaga muamua aʻo leʻi faʻaaogaina. O lo'o fa'amaoti mai o se numera (po'o se vector) ma e ta'ua o se fatu (fua fa'afuase'i). E masani lava, o le fa'asologa o le uati processor po'o le numera tutusa o le taimi faʻaoga e faʻaaogaina e fai ma fatu.

  2. Fa'asologa fa'asologa.

    O le PRNG e matua fa'amoemoeina, o lea o le fatu na fa'amaonia i le taimi o le amataga e fa'apitoa ai le fa'asologa o numera i le lumana'i. O lona uiga o se PRNG ese'ese na amataina i le fatu lava e tasi (i taimi eseese, i polokalame eseese, i masini eseese) o le a fa'atupuina le fa'asologa tutusa.

E mana'omia fo'i ona e iloa le fa'asoasoaina o fa'alavelave e fa'aalia ai le PRNG - o le a le numera o le a fa'atupuina ma o le a le fa'alavelave. Ole tele o taimi ole fa'asoa masani lea po'o le tufatufaina tutusa.
BlessRNG pe siaki le RNG mo le saʻo
Tufatufa masani (agavale) ma le tufaina o toniga (taumatau)

Se'i faapea e iai le tatou oti e 24 itu. Afai e te togiina, o le avanoa e maua ai le tasi o le a tutusa ma le 1/24 (tutusa ma le avanoa e maua ai se isi numera). Afai e te faia ni togi se tele ma faamaumau i'uga, o le a e matauina e to'ulu uma pito i fafo e tusa ma le taimi tutusa. O le mea moni, o lenei mate e mafai ona taʻua o se RNG faʻatasi ai ma se tufatufaina tutusa.

Ae fa'afefea pe a e togi le 10 o nei dice i le taimi e tasi ma faitau le aofa'i o 'ai? O le a fa'atumauina le tutusa mo lea mea? Leai. O le tele o taimi, o le aofaʻi o le a latalata ile 125 points, o lona uiga, i se tau averesi. Ma o se taunuuga, e tusa lava pe leʻi faia se togi, e mafai ona e faʻatusatusaina le taunuuga i le lumanaʻi.

O le mafuaaga o loʻo i ai le numera sili o faʻasalalauga e maua ai le togi averesi. O le mamao mai ai, o le itiiti ifo o faʻapotopotoga - ma, e tusa ai, o le faʻaititia o le avanoa e leiloa. Afai e va'aia nei fa'amatalaga, o le a fa'atusa le foliga o se logo. O le mea lea, faʻatasi ai ma sina faʻalauteleina, o se faiga o 10 dice e mafai ona taʻua o se RNG ma se tufatufa masani.

O le isi faʻataʻitaʻiga, naʻo le taimi lea i luga o se vaalele - fana i se faʻamoemoe. O le fana o le a avea ma RNG e faʻatupuina se pea numera (x, y) o loʻo faʻaalia i luga o le kalafi.
BlessRNG pe siaki le RNG mo le saʻo
Talitonu o le filifiliga i le agavale e latalata i le olaga moni - o le RNG lea ma se tufatufa masani. Ae afai e te manaʻomia le faʻasalalau fetu i se lagi pogisa, ona sili atu lea ona fetaui le filifiliga saʻo, maua mai le RNG faʻatasi ai ma le tufatufaina atu o toniga. I se tulaga lautele, filifili se afi afi e faʻatatau i le galuega o loʻo i ai.

Sei o tatou talanoa e uiga i le entropy o le PNG faasologa. Mo se faʻataʻitaʻiga, o loʻo i ai se faʻasologa e amata faʻapenei:

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

O le a le fa'afuase'i o nei fuainumera i le tepa muamua? Tatou amata i le siakiina o le tufatufaina.
BlessRNG pe siaki le RNG mo le saʻo
E foliga latalata i le togiga, ae afai e te faitau i se faasologa o numera e lua ma faʻamatalaina o ni faʻamaopoopo i luga o se vaalele, e te mauaina lenei:
BlessRNG pe siaki le RNG mo le saʻo
O mamanu e iloa lelei. Ma talu ai o faʻamaumauga i le faʻasologa o loʻo faʻatonuina i se auala patino (o lona uiga, e maualalo le entropy), e mafai ona mafua ai lena lava "faʻaituau". I se tulaga maualalo, o sea PRNG e le talafeagai mo le fausiaina o faʻasalalauga i luga o se vaalele.

Se isi fa'asologa:

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

E foliga mai o loʻo lelei mea uma iinei e oʻo lava i luga o le vaalele:
BlessRNG pe siaki le RNG mo le saʻo
Sei o tatou tilotilo i le voluma (faitau numera e tolu i le taimi):
BlessRNG pe siaki le RNG mo le saʻo
Ma toe fai foi mamanu. Ua le toe mafai ona fausia se ata vaaia i itu e fa. Ae o mamanu e mafai ona i ai i luga o lenei itu ma luga o lapopoa.

I cryptography, pe a tuʻuina atu manaʻoga sili ona mamafa i PRNGs, o sea tulaga e matua le taliaina. O le mea lea, o algorithms faʻapitoa ua atiaʻe e iloilo ai lo latou lelei, lea o le a tatou le paʻi atu i ai nei. O le autu e lautele ma e tatau i se tala ese.

Suʻega

Afai tatou te le iloa mautinoa se mea, faʻafefea ona galue i ai? E aoga le kolosiina o le auala pe afai e te le iloa po o le fea moli taavale e mafai ai? Atonu e eseese taunuuga.

E fa'apea fo'i i le ta'uta'ua o fa'alavelave i le Lotogatasi. E lelei pe afai o faʻamaumauga e faʻaalia ai faʻamatalaga talafeagai, ae o le tala o loʻo taʻua i le amataga o le tusiga na tupu tonu ona o le leai o ni faʻamatalaga manaʻomia.

Ma afai e te le iloa pe faʻafefea ona galue le meafaigaluega, o le a le mafai ona e faʻaogaina saʻo. I se tulaga lautele, ua oʻo mai le taimi e siaki ai ma faia se faʻataʻitaʻiga ina ia mautinoa mulimuli ane e uiga i le tufatufaga.

O le fofo sa faigofie ma aoga - aoina fuainumera, maua faʻamatalaga faʻamoemoe ma vaʻai i taunuuga.

Mataupu o su'esu'ega

E tele auala e fa'atupu ai numera fa'afuase'i i le Unity - na matou fa'ata'ita'iina le lima.

  1. System.Random.Next(). E fa'atupuina fa'atasi i se vaega o tau.
  2. System.Random.NextDouble(). Fa'atupu numera sa'o fa'alua i le va'aiga mai le [0; 1).
  3. UnityEngine.Random.Range(). Fa'atupuina numera sa'o tasi (fa'aola) i se fa'avasegaga o tau.
  4. UnityEngine.Random.value. Fa'atupu numera sa'o tasi (opeopea) i le va'aiga mai le [0; 1).
  5. Unity.Mathematics.Random.NextFloat(). Vaega o le faletusi fou Unity.Mathematics. Fa'atupuina numera sa'o tasi (fa'aola) i se fa'avasegaga o tau.

Toeitiiti lava i soʻo se mea i totonu o faʻamaumauga na faʻamaonia ai le tufatufaina atu o toniga, sei vagana ai UnityEngine.Random.value (lea e leʻi faʻamaonia ai le tufatufaina, ae e ala i le faʻatusa ma UnityEngine.Random.Range() toniga na faʻamoemoeina) ma Unity.Mathematics.Random .NextFloat() (lea i totonu O le faavae o le xorshift algorithm, o lona uiga e toe manaʻomia ona e faʻatali mo se tufatufa toniga).

Ona o le faaletonu, o i'uga na fa'amoemoeina na faia e pei ona fa'ailoa mai i fa'amaumauga.

Auala

Na matou tusia se tamaʻi talosaga na faʻatupuina faʻasologa o numera faʻafuaseʻi e faʻaaoga ai metotia taʻitasi ma faʻasaoina iʻuga mo le faʻagasolo atili.

Ole umi ole fa'asologa ta'itasi e 100 numera.
Ole tele ole numera fa'afuase'i ole [0).

O faʻamatalaga na aoina mai le tele o faʻasalalauga faʻapitoa:

  • pupuni
    — Unity v2018.3.14f1, Fa'atonu faiga, Mono, .NET Standard 2.0
  • macOS
    — Unity v2018.3.14f1, Fa'atonu faiga, Mono, .NET Standard 2.0
    — Unity v5.6.4p4, Fa'atonu ala, Mono, .NET Standard 2.0
  • Android
    — Lotogatasi v2018.3.14f1, fau ile masini, Mono, .NET Standard 2.0
  • iOS
    — Lotogatasi v2018.3.14f1, fau ile masini, il2cpp, .NET Standard 2.0

Реализация

E tele a matou auala eseese e fa'atupu ai numera fa'afuase'i. Mo i latou taʻitasi, matou te tusia se vasega faʻapipiʻi eseese, lea e tatau ona tuʻuina atu:

  1. Avanoa e seti le tele o tau [min / max). O le a setiina e ala i le faufale.
  2. Metotia toe faafoi MF. Se'i o tatou filifili o le fa'apeopea e pei o le ituaiga, aua e sili atu ona lautele.
  3. Le igoa ole fa'atupulaga metotia mo le fa'ailogaina o taunu'uga. Mo le faʻaogagofie, o le a matou toe faʻafoʻi atu o se tau le igoa atoa o le vasega + le igoa o le metotia na faʻaaogaina e gaosia ai le MF.

Muamua, seʻi o tatou faʻaalia se faʻamatalaga o le a faʻatusalia e le IRandomGenerator interface:

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

        float Generate();
    }
}

Fa'atinoga o System.Random.Next()

O lenei metotia e mafai ai ona e setiina le tele o tau, ae toe faʻafoʻi faʻatasi, ae manaʻomia faʻafefe. E mafai ona e faʻamatalaina le integer e pei o se faʻafefe, pe mafai foi ona e faʻalauteleina le tele o tau e ala i le tele o faʻatonuga o le tele, faʻatauina i latou i augatupulaga taʻitasi o le vaeluagalemu. O le taunuuga o le a avea ma se mea e pei o se tulaga-maua ma se faasologa tuuina atu o le sa'o. O le a matou faʻaogaina lenei filifiliga talu ai e latalata i le tau faʻafefe moni.

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

Fa'atinoina o le System.Random.NextDouble()

O iinei le fa'atulagaina o tulaga taua [0; 1). Ina ia faʻapipiʻi i luga o le mea o loʻo faʻamaonia i totonu o le faufale, matou te faʻaaogaina numera faigofie: 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;
    }
}

Fa'atinoga o le UnityEngine.Random.Range()

O lenei metotia o le UnityEngine.Random static class e mafai ai ona e setiina le tele o tau ma toe faʻafoʻi se ituaiga faʻafefe. E te le tau faia ni suiga faaopoopo.

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

Fa'atinoga o le UnityEngine.Random.value

O le tau o meatotino a le vasega static UnityEngine.Random e toe faʻafoʻi mai se ituaiga faʻafefe mai se faʻamautu o tau [0; 1). Se'i o tatou fa'atino i luga o se vaega tu'ufa'atasia i le auala lava e tasi e pei ona fa'atinoina 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;
    }
}

Fa'atinoga o le Unity.Mathematics.Random.NextFloat()

O le NextFloat() metotia a le vasega Unity.Mathematics.Random e toe fa'afo'i mai ai se vaega fa'afefeteina o le ituaiga opeopea ma fa'atagaina oe e fa'ama'oti le tele o tau. Pau lava le fa'aaliga o fa'ata'ita'iga ta'itasi o le Unity.Mathematics.Random e tatau ona fa'amataina i ni fatu - o le auala lea o le a tatou aloese ai mai le fa'atupuina o fa'asologa toe fai.

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

Fa'atinoga o le MainController

E tele faʻatinoga o IRandomGenerator ua sauni. O le isi, e tatau ona e fa'atupu fa'asologa ma fa'asaoina le fa'asologa o fa'amaumauga mo le gaioiga. Ina ia faia lenei mea, o le a matou fatuina se vaaiga ma se tamai tusi MainController i le Unity, lea o le a faia uma galuega talafeagai ma i le taimi lava e tasi e nafa ma fegalegaleaiga ma le UI.

Sei o tatou setiina le tele o le faʻamaumauga ma le tele o tau o le MF, ma maua foi se auala e toe faʻafoʻi ai le tele o afi faʻapipiʻi ma sauni e galue.

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

        ...
    }
}

Se'i o tatou faia se fa'amaumauga. I le tulaga lea, o le a tu'ufa'atasia le fa'atupuina o fa'amaumauga ma le fa'amauina o fa'ai'uga i totonu o se fa'asologa o tusitusiga (i le csv format). Ina ia teuina tulaga taua o IRandomGenerator taʻitasi, o lona lava koluma e tuʻuina atu, ma o le laina muamua o loʻo i ai le Igoa o le afi.

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

        ...
    }
}

Pau lava le mea o loʻo totoe o le valaʻau lea o le GenerateCsvDataSet method ma faʻapolopolo le taunuʻuga i se faila, pe vave faʻafeiloaʻi faʻamatalaga i luga o le upega tafaʻilagi mai le masini faʻaiʻu i le server e mauaina.

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

        ...
    }
}

O puna'oa o le poloketi o lo'o i GitLab.

Iʻuga

E leai se vavega na tupu. O le mea na latou faʻamoemoeina o le mea na latou maua - i tulaga uma, o se tufatufa tutusa e aunoa ma se faʻailoga o taupulepulega leaga. Ou te le iloa le uiga o le tuʻuina o kalafi eseese mo faʻavae - latou te faʻaalia uma iʻuga tutusa.

O le mea moni e:
BlessRNG pe siaki le RNG mo le saʻo

Va'aiga o fa'asologa i luga o se va'alele mai metotia uma o augatupulaga e lima:
BlessRNG pe siaki le RNG mo le saʻo

Ma fa'aaliga i le 3D. O le a ou tuʻuina naʻo le taunuʻuga o System.Random.Next() ina ia aua neʻi maua ai le tele o mea tutusa.
BlessRNG pe siaki le RNG mo le saʻo

O le tala na taʻu mai i le folasaga e uiga i le tufatufaina masani o UnityEngine. Random e leʻi toe faia: pe na muamua sese, pe o se mea ua suia talu mai le afi. Ae o lea ua tatou mautinoa.

puna: www.habr.com

Faaopoopo i ai se faamatalaga