BlessRNG kapa ho hlahloba RNG bakeng sa toka

BlessRNG kapa ho hlahloba RNG bakeng sa toka

Ho nts'etsopele ea lipapali, hangata ho hlokahala hore u tlamelle ntho e itseng ka tšohanyetso: Bonngoe bo na le Random ea bona bakeng sa sena, 'me ka ho tsamaisana le eona ho na le System.Random. Ka nako e 'ngoe, ho e' ngoe ea merero, ke ile ka ba le maikutlo a hore ka bobeli ba ka sebetsa ka tsela e fapaneng (le hoja ba lokela ho ba le kabo e tšoanang).

Joale ha baa ka ba kena lintlha - ho ne ho lekane hore phetoho ho System.Random e lokise mathata ohle. Joale re ile ra etsa qeto ea ho e sheba ka botlalo le ho etsa lipatlisiso tse nyane: hore na li-RNG "tse leeme" kapa tse lebelletsoeng esale pele li joang, le hore na u khetha efe. Ho feta moo, ka makhetlo a mangata ke utloile maikutlo a hanyetsanang ka "botšepehi" ba bona - a re leke ho fumana hore na liphello tsa sebele li bapisoa joang le tse phatlalalitsoeng.

Lenaneo le lekhutšoane la thuto kapa RNG ha e le hantle ke RNG

Haeba u se u ntse u tloaelane le lijenereithara tsa linomoro tse sa reroang, joale u ka tlolela hang-hang karolo ea "Teko".

Linomoro tse sa reroang (RN) ke tatellano ea linomoro tse hlahisoang ho sebelisoa ts'ebetso e itseng e sa reroang (moferefere), mohloli oa entropy. Ke hore, ena ke tatelano eo likarolo tsa eona li sa hokahaneng le molao ofe kapa ofe oa lipalo - ha li na kamano ea sesosa le phello.

Se etsang palo e sa reroang se bitsoa jenereithara ea nomoro e sa reroang (RNG). Ho ka bonahala eka ntho e 'ngoe le e' ngoe ke ea motheo, empa haeba re tloha khopolong ho ea ho itloaetsa, joale ha e le hantle ha ho bonolo ho kenya ts'ebetsong algorithm ea software bakeng sa ho hlahisa tatellano e joalo.

Lebaka ke ho ba sieo ha pherekano e tšoanang lisebelisoa tsa mehleng ea kajeno tsa elektronike. Ntle le eona, linomoro tse sa reroang li khaotsa ho ba ka tšohanyetso, 'me jenereithara ea tsona e fetoha mosebetsi o tloaelehileng oa likhang tse hlalositsoeng ka ho hlaka. Bakeng sa tse 'maloa tse khethehileng tšimong ea IT, ena ke bothata bo tebileng (mohlala, cryptography), empa ho ba bang ho na le tharollo e amohelehang ka ho feletseng.

Hoa hlokahala ho ngola algorithm e neng e tla khutla, le hoja e se linomoro tse sa reroang, empa e le haufi le tsona ka hohle kamoo ho ka khonehang - seo ho thoeng ke linomoro tsa pseudo-random (PRN). Algorithm tabeng ena e bitsoa pseudorandom number generator (PRNG).

Ho na le likhetho tse 'maloa tsa ho theha PRNG, empa tse latelang li tla sebetsa ho bohle:

  1. Tlhokahalo ea ho qala qalong.

    PRNG ha e na mohloli oa entropy, kahoo e tlameha ho fuoa boemo ba pele pele e sebelisoa. E hlalosoa e le nomoro (kapa vector) mme e bitsoa peo (peo e sa reroang). Hangata, k'hamera ea lioache ea processor kapa palo e lekanang ea nako ea sistimi e sebelisoa e le peo.

  2. Tatelano ya ho ikatisa.

    PRNG e na le qeto e felletseng, ka hona, peo e boletsoeng nakong ea ho qala ke eona e khethollang tatellano ea linomoro tsa bokamoso. Sena se bolela hore PRNG e arohaneng e qalileng ka peo e tšoanang (ka linako tse fapaneng, mananeong a fapaneng, lisebelisoa tse fapaneng) e tla hlahisa tatellano e tšoanang.

U boetse u hloka ho tseba kabo ea menyetla e khethollang PRNG - hore na e tla hlahisa linomoro life le hore na ke monyetla ofe. Hangata sena ke kabo e tloaelehileng kapa kabo e tšoanang.
BlessRNG kapa ho hlahloba RNG bakeng sa toka
Kabo e tloaelehileng (ka ho le letšehali) le kabo e tšoanang (ka ho le letona)

Ha re re re na le lefu le nang le mahlakore a 24. Haeba u e lahlela, monyetla oa ho fumana e tla lekana le 1/24 (e tšoanang le monyetla oa ho fumana nomoro efe kapa efe). Haeba u etsa makhetlo a mangata 'me u ngola liphetho, u tla hlokomela hore mahlakore ohle a theoha ka makhetlo a lekanang. Ha e le hantle, lefu lena le ka nkoa e le RNG e nang le kabo e tšoanang.

Ho thoe'ng haeba u lahlela 10 ea litaese tsena hang-hang 'me u bala lintlha kaofela? Na ho tla bolokoa ho tšoana hoa eona? Che. Hangata, chelete e tla ba haufi le lintlha tse 125, ke hore, ho boleng bo itseng ba karolelano. 'Me ka lebaka leo, le pele u lahla, u ka hakanya sephetho sa nako e tlang.

Lebaka ke hore ho na le palo e kholo ka ho fetisisa ea metsoako ho fumana lintlha tse tloaelehileng. Ha e le hole le eona, metsoako e fokolang - 'me, ka hona, e fokotsa menyetla ea tahlehelo. Haeba data ena e bonoa, e tla tšoana hantle le sebopeho sa tšepe. Ka hona, ka mokhoa o itseng o otlolohileng, tsamaiso ea 10 dice e ka bitsoa RNG e nang le kabo e tloaelehileng.

Mohlala o mong, feela lekhetlong lena ka sefofane - ho thunya sepheo. Sethunya e tla ba RNG e hlahisang palo ea linomoro (x, y) e hlahang graph.
BlessRNG kapa ho hlahloba RNG bakeng sa toka
Lumellana hore khetho e ka letsohong le letšehali e haufi le bophelo ba sebele - ena ke RNG e nang le kabo e tloaelehileng. Empa haeba o hloka ho hasanya linaleli leholimong le lefifi, joale khetho e nepahetseng, e fumanoang ka RNG e nang le kabo e tšoanang, e loketse hamolemo. Ka kakaretso, khetha jenereithara ho itšetlehile ka mosebetsi o etsoang.

Joale ha re bue ka entropy ea tatellano ea PNG. Ka mohlala, ho na le tatellano e qalang ka tsela ena:

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

Linomoro tsee li iketsahalla hakae ha u habanya feela? Ha re qale ka ho hlahloba kabo.
BlessRNG kapa ho hlahloba RNG bakeng sa toka
E shebahala e le haufi le junifomo, empa haeba u bala tatellano ea linomoro tse peli ebe u li hlalosa e le likhokahano sefofaneng, u fumana sena:
BlessRNG kapa ho hlahloba RNG bakeng sa toka
Lipaterone li bonahala ka ho hlaka. 'Me kaha data ka tatellano e laetsoe ka tsela e itseng (ke hore, e na le entropy e tlaase), sena se ka hlahisa "leeme" leo. Bonyane, PRNG e joalo ha e tšoanelehe haholo bakeng sa ho hlahisa lihokahanyo sefofaneng.

Tatelano e nngwe:

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

Tsohle li bonahala li lokile mona esita le sefofaneng:
BlessRNG kapa ho hlahloba RNG bakeng sa toka
Ha re shebeng molumo (bala linomoro tse tharo ka nako):
BlessRNG kapa ho hlahloba RNG bakeng sa toka
'Me hape mekhoa. Ha ho sa khoneha ho etsa setšoantšo ka litekanyo tse 'nè. Empa lipaterone li ka ba teng ntlheng ena le ho tse kholoanyane.

Ho cryptography, moo litlhoko tse thata ka ho fetisisa li behiloeng ho PRNGs, boemo bo joalo ha bo amohelehe ka mokhoa o hlakileng. Ka hona, ho entsoe li-algorithms tse khethehileng ho hlahloba boleng ba tsona, tseo re ke keng ra li ama hona joale. Sehlooho se pharaletseng 'me se lokeloa ke sengoloa se arohaneng.

Teko

Haeba re sa tsebe ho hong ka tieo, joale re ka sebetsa le eona joang? Na ho bohlokoa ho tšela tsela haeba u sa tsebe hore na ke lebone lefe la sephethephethe le le lumellang? Liphello e ka ba tse fapaneng.

Hoa tšoana le ka ho tsebahala ho sa tloaelehang ho Unity. Ho hotle haeba litokomane li senola lintlha tse hlokahalang, empa pale e boletsoeng qalong ea sehlooho e etsahetse hantle ka lebaka la khaello ea lintlha tse tobileng tse lakatsehang.

'Me haeba u sa tsebe hore na sesebelisoa se sebetsa joang, u ke ke ua khona ho se sebelisa ka nepo. Ka kakaretso, nako e fihlile ea ho hlahloba le ho etsa liteko ho netefatsa bonyane ka kabo.

Tharollo e ne e le bonolo ebile e sebetsa - bokella lipalo-palo, fumana lintlha tsa sepheo le ho sheba liphetho.

Sehlooho sa thuto

Ho na le mekhoa e mengata ea ho hlahisa linomoro tse sa reroang ho Unity - re lekile tse hlano.

  1. Tsamaiso.Random.E latelang(). E hlahisa linomoro ka bongata bo itseng ba boleng.
  2. Tsamaiso.Random.NextDouble(). E hlahisa linomoro tse nepahetseng habeli ho tloha ho [0; 1).
  3. UnityEngine.Random.Range(). E hlahisa linomoro tse nepahetseng (ho phaphamala) ka mofuta o itseng oa boleng.
  4. UnityEngine.Random.value. E hlahisa linomoro tse nepahetseng (li phaphamala) ho tloha ho [0; 1).
  5. Unity.Mathematics.Random.NextFloat(). Karolo ea laebrari e ncha ea Unity.Mathematics. E hlahisa linomoro tse nepahetseng (ho phaphamala) ka mofuta o itseng oa boleng.

Hoo e batlang e le hohle litokomaneng ho ile ha hlalosoa kabo e tšoanang, ntle le UnityEngine.Random.value (moo kabo e sa boleloang, empa ka papiso le UnityEngine.Random.Range() uniform le eona e ne e lebelletsoe) le Unity.Mathematics.Random. .NextFloat() (moo ho Motheo e leng xorshift algorithm, e bolelang hore hape o hloka ho emela kabo e tšoanang).

Ka ho sa feleng, liphetho tse lebelletsoeng li nkuoe joalo ka tse boletsoeng litokomaneng.

Theknoloji

Re ngotse ts'ebeliso e nyane e hlahisitseng tatellano ea linomoro tse sa reroang re sebelisa e 'ngoe le e' ngoe ea mekhoa e hlahisitsoeng mme ra boloka liphetho bakeng sa ts'ebetso e tsoelang pele.

Bolelele ba tatellano ka 'ngoe ke linomoro tsa 100.
Lenane la linomoro tse sa reroang ke [0, 100).

Lintlha li ile tsa bokelloa ho tsoa ho li-platform tse 'maloa tse reretsoeng:

  • Windows
    - Unity v2018.3.14f1, Editor mode, Mono, .NET Standard 2.0
  • macOS
    - Unity v2018.3.14f1, Editor mode, Mono, .NET Standard 2.0
    - Bonngoe v5.6.4p4, Mokhoa oa Mohlophisi, Mono, .NET Standard 2.0
  • Android
    - Unity v2018.3.14f1, haha ​​ka sesebelisoa, Mono, .NET Standard 2.0
  • iOS
    - Unity v2018.3.14f1, haha ​​ka sesebelisoa, il2cpp, .NET Standard 2.0

Ts'ebetsong

Re na le mekhoa e mengata e fapaneng ea ho etsa linomoro tse sa reroang. Bakeng sa e 'ngoe le e' ngoe ea bona, re tla ngola sehlopha se arohaneng sa wrapper, se lokelang ho fana ka:

  1. Monyetla oa ho beha mefuta e mengata ea boleng [min/max). E tla hlophisoa ka sehahi.
  2. Mokhoa oa ho khutlisa MF. Ha re khetheng float joalo ka mofuta, kaha e tloaelehile haholoanyane.
  3. Lebitso la mokhoa oa moloko oa ho tšoaea liphetho. Bakeng sa boiketlo, re tla khutlisetsa e le boleng lebitso le feletseng la sehlopha + lebitso la mokhoa o sebelisoang ho hlahisa MF.

Taba ea pele, ha re phatlalatseng sekhechana se tla emeloa ke sebopeho sa IRandomGenerator:

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

        float Generate();
    }
}

Phethahatso ea Tsamaiso.Random.Next()

Mokhoa ona o u lumella ho beha mefuta e mengata ea litekanyetso, empa e khutlisa palo e feletseng, empa ho hlokahala liphaphatha. O ka fetolela palo e felletseng e le phaphametseng, kapa o ka holisa mefuta ea boleng ka liodara tse 'maloa tsa boholo, oa li lefa ka moloko o mong le o mong oa mahareng. Sephetho e tla ba ntho e kang ntlha e tsitsitseng e nang le taelo e fanoeng ea ho nepahala. Re tla sebelisa khetho ena kaha e haufi le boleng ba 'nete ba float.

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

Phethahatso ea Tsamaiso.Random.NextDouble()

Mona lethathamo le tsitsitseng la boleng [0; 1). Ho e hlahisa ho e boletsoeng ho moetsi, re sebelisa lipalo tse bonolo: 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;
    }
}

Ts'ebetsong ea UnityEngine.Random.Range()

Mokhoa ona oa UnityEngine.Random static class e u lumella ho beha mefuta e mengata ea boleng le ho khutlisa mofuta oa float. Ha ho hlokahale hore u etse liphetoho tse ling hape.

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

Ho kenngwa tshebetsong ha UnityEngine.Random.value

Thepa ea boleng ba sehlopha sa static UnityEngine.Random e khutlisa mofuta oa float ho tsoa mofuteng o tsitsitseng oa boleng [0; 1). Ha re e kenye lethathamong le fanoeng ka tsela e ts'oanang le ha re kenya ts'ebetsong 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;
    }
}

Ho Kenngwa Tshebetsong ha Unity.Mathematics.Random.NextFloat()

Mokhoa oa NextFloat() oa Unity.Mathematics.Mokhahlelo o sa reroang o khutlisa ntlha e phaphametseng ea mofuta oa float mme o o lumella ho hlakisa mefuta e mengata ea boleng. Ntho feela e fapaneng ke hore mohlala o mong le o mong oa Unity.Mathematics.Ka tšohanyetso ho tla tlameha ho qalisoa ka peo e itseng - ka tsela ena re tla qoba ho hlahisa tatellano e pheta-phetoang.

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

Ts'ebetsong ea MainController

Lisebelisoa tse 'maloa tsa IRandomGenerator li se li lokile. Ka mor'a moo, o hloka ho hlahisa tatellano le ho boloka dataset e hlahisoang bakeng sa ho sebetsa. Ho etsa sena, re tla theha sebaka le mongolo o monyane oa MainController ho Unity, o tla etsa mosebetsi oohle o hlokahalang mme ka nako e ts'oanang o be le boikarabello ba ho sebelisana le UI.

Ha re beheng boholo ba dataset le mefuta e fapaneng ea boleng ba MF, hape re fumane mokhoa o khutlisang letoto la lijenereithara tse hlophisitsoeng 'me li loketse ho sebetsa.

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

        ...
    }
}

Joale ha re theheng dataset. Tabeng ena, tlhahiso ea data e tla kopanngoa le ho rekota liphetho ho molaetsa oa mongolo (ka mokhoa oa csv). Ho boloka boleng ba IRandomGenerator ka 'ngoe, kholomo ea eona e arohaneng e abetsoe,' me mohala oa pele o na le Lebitso la jenereithara.

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

        ...
    }
}

Sohle se setseng ke ho letsetsa mokhoa oa GenerateCsvDataSet le ho boloka sephetho ho faele, kapa hang-hang fetisetsa data ka marang-rang ho tloha mochine oa ho qetela ho ea ho seva se amohelang.

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

        ...
    }
}

Mehloli ea morero e ho GitLab.

Liphetho

Ha ho mohlolo o etsahetseng. Seo ba neng ba se lebelletse ke seo ba se fumaneng - maemong 'ohle, kabo e lekanang ntle le leseli la merero ea bolotsana. Ha ke bone ntlha ea ho beha li-graph tse arohaneng bakeng sa sethala - kaofela li bonts'a liphetho tse batlang li tšoana.

'Nete ke hore:
BlessRNG kapa ho hlahloba RNG bakeng sa toka

Pono ea tatellano ea sefofane ho tsoa mekhoeng eohle e mehlano ea meloko:
BlessRNG kapa ho hlahloba RNG bakeng sa toka

Le pono ea 3D. Ke tla siea feela sephetho sa System.Random.Next() e le ho se hlahise bongata ba litaba tse ts'oanang.
BlessRNG kapa ho hlahloba RNG bakeng sa toka

Pale e boletsoeng selelekeleng mabapi le kabo e tloaelehileng ea UnityEngine.Random ha ea ka ea ipheta: ebang e ne e fosahetse qalong, kapa ho na le ho hong ho fetohileng enjeneng. Empa joale re na le bonnete.

Source: www.habr.com

Eketsa ka tlhaloso