BlessRNG ma ọ bụ lelee RNG maka izi ezi

BlessRNG ma ọ bụ lelee RNG maka izi ezi

Na mmepe egwuregwu, ị na-achọkarị ijikọ ihe na-enweghị ihe ọ bụla: ịdị n'otu nwere Random nke ya maka nke a, yana n'akụkụ ya bụ System.Random. N'otu oge, na otu n'ime ọrụ ndị ahụ, enwere m mmetụta na ha abụọ nwere ike ịrụ ọrụ dị iche iche (ọ bụ ezie na ha kwesịrị inwe nkesa).

Mgbe ahụ, ha abanyeghị na nkọwa - o zuru oke na mgbanwe na System.Random dozie nsogbu niile. Ugbu a, anyị kpebiri ileba anya n'ime ya n'ụzọ zuru ezu ma mee ntakịrị nyocha: otu RNG si bụrụ "eleghị anya" ma ọ bụ nke a na-atụghị anya ya, na nke ị ga-ahọrọ. Ọzọkwa, m anụwo ihe karịrị otu ugboro echiche na-emegiderịta onwe ha banyere "ịkwụwa aka ọtọ" ha - ka anyị gbalịa chọpụta otú ezigbo nsonaazụ si tụnyere ndị ahụ ekwuputara.

Mmemme nkuzi dị nkenke ma ọ bụ RNG bụ RNG n'ezie

Ọ bụrụ na ị maaralarị ndị na-emepụta nọmba random, mgbe ahụ ị nwere ike ịgafe na ngalaba "Nnwale" ozugbo.

Nọmba random (RN) bụ usoro ọnụọgụgụ ewepụtara site na iji usoro enweghị usoro (ọgbaaghara), isi iyi nke entropy. Ya bụ, nke a bụ usoro nke iwu mgbakọ na mwepụ ọ bụla ejikọtaghị ihe ndị mejupụtara ya - ha enweghị njikọ na-akpata na mmetụta.

Ihe na-emepụta nọmba random ka a na-akpọ generator nọmba random (RNG). Ọ ga-adị ka ihe niile bụ elementrị, ma ọ bụrụ na anyị na-esi na tiori na-eme omume, mgbe ahụ n'ezie, ọ bụghị otú ahụ dị mfe iji mejuputa a software algọridim maka na-amụ dị otú ahụ usoro.

Ihe kpatara ya bụ na enweghị otu ọgba aghara ahụ na ngwa eletrọnịkị nke oge a. Na-enweghị ya, ọnụọgụ na-enweghị usoro na-akwụsị ịbụ enweghị usoro, na generator ha na-atụgharị ghọọ ọrụ nkịtị nke arụmụka akọwapụtara nke ọma. Maka ọtụtụ ọpụrụiche na ngalaba IT, nke a bụ nsogbu siri ike (dịka ọmụmaatụ, cryptography), mana maka ndị ọzọ enwere azịza nnabata kpamkpam.

Ọ dị mkpa ide algọridim nke ga-alọghachi, n'agbanyeghị na ọ bụghị ọnụọgụ ọnụọgụ n'ezie, mana dịka o kwere mee na ha - nke a na-akpọ nọmba pseudo-random (PRN). Algọridim n'okwu a ka a na-akpọ pseudorandom nọmba generator (PRNG).

Enwere ọtụtụ nhọrọ maka ịmepụta PRNG, mana ihe ndị a ga-adabara onye ọ bụla:

  1. Mkpa mmalite mmalite.

    PRNG enweghị isi iyi nke entropy, yabụ a ga-enyerịrị ya steeti mbụ tupu ejiri ya. A kọwapụtara ya dị ka ọnụọgụ (ma ọ bụ vector) a na-akpọkwa ya mkpụrụ (mkpụrụ enweghị usoro). Ọtụtụ mgbe, a na-eji akara elekere processor ma ọ bụ ọnụọgụ dakọtara oge sistemụ dị ka mkpụrụ.

  2. Usoro reproducibility.

    PRNG bụ ihe nleba anya zuru oke, yabụ mkpụrụ akọwapụtara n'oge mbido na-ekpebi ọnụọgụ ọnụọgụ n'ọdịnihu. Nke a pụtara na PRNG dị iche nke ejiri otu mkpụrụ malite (n'oge dị iche iche, na mmemme dị iche iche, na ngwaọrụ dị iche iche) ga-ewepụta otu usoro.

Ị ga-achọkwa ịma nkesa nke puru omume nke na-akọwa PRNG - ọnụọgụgụ ọ ga-emepụta yana ihe nwere ike ime. Ọtụtụ mgbe nke a bụ nkesa nkịtị ma ọ bụ nkesa otu.
BlessRNG ma ọ bụ lelee RNG maka izi ezi
Nkesa nkịtị (aka ekpe) na nkesa otu (aka nri)

Ka anyị kwuo na anyị nwere ọmarịcha anwụ nwere akụkụ 24. Ọ bụrụ na ị tụfuo ya, ohere nke ịnweta otu ga-abụ 1/24 (otu ihe ahụ dị ka ohere ịnweta nọmba ọ bụla). Ọ bụrụ na ị na-eme ọtụtụ ihe atụ ma dekọọ rịzọlt, ị ga-achọpụta na akụkụ niile na-ada na ihe dịka otu ugboro. N'ụzọ bụ isi, enwere ike ịtụle ọnwụ a dị ka RNG nwere nkesa otu.

Gịnị ma ọ bụrụ na ị tụfuo 10 n'ime dice ndị a otu mgbe wee gụọ mkpokọta isi? A ga-edobe otu n'otu maka ya? Mba. Ọtụtụ mgbe, ego ga-adị nso na 125 isi, ya bụ, na ụfọdụ nkezi uru. N'ihi nke a, ọbụlagodi tupu ịme ihe atụ, ị nwere ike ịkọwa ihe ga-esi na ya pụta n'ọdịnihu.

Ihe kpatara ya bụ na enwere ọnụ ọgụgụ kachasị ukwuu nke njikọta iji nweta akara nkezi. N'ebe dị anya site na ya, nchịkọta ole na ole - na, ya mere, na-ebelata ohere nke ọnwụ. Ọ bụrụ na egosipụtara data a, ọ ga-adị ka mgbịrịgba. Ya mere, na ụfọdụ gbatịa, a usoro nke 10 dice nwere ike na-akpọ RNG na nkịtị nkesa.

Ihe atụ ọzọ, naanị oge a na ụgbọ elu - agbapụ na ihe mgbaru ọsọ. Onye na-agba ụta ga-abụ RNG nke na-ewepụta ọnụọgụ abụọ (x, y) nke egosiri na eserese ahụ.
BlessRNG ma ọ bụ lelee RNG maka izi ezi
Kweta na nhọrọ dị n'aka ekpe dị nso na ndụ n'ezie - nke a bụ RNG nwere nkesa nkịtị. Ma ọ bụrụ na ịchọrọ ịgbasa kpakpando na mbara igwe gbara ọchịchịrị, mgbe ahụ nhọrọ ziri ezi, nke enwetara site na iji RNG na nkesa edo, ka mma. N'ozuzu, họrọ generator dabere na ọrụ dị n'aka.

Ugbu a, ka anyị kwuo maka entropy nke usoro PNG. Dịka ọmụmaatụ, enwere usoro na-amalite dị ka nke a:

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

Kedu ka ọnụọgụ ndị a si bụrụ enweghị usoro na nlele mbụ? Ka anyị malite site na ịlele nkesa.
BlessRNG ma ọ bụ lelee RNG maka izi ezi
Ọ dị nso na otu, mana ọ bụrụ na ị gụọ usoro ọnụọgụ abụọ wee kọwapụta ha dị ka nhazi n'ụgbọelu, ị ga-enweta nke a:
BlessRNG ma ọ bụ lelee RNG maka izi ezi
Ụdị na-apụta nke ọma. Ma ebe ọ bụ na a na-enye data dị n'usoro n'usoro n'ụzọ ụfọdụ (ya bụ, ọ nwere obere entropy), nke a nwere ike ime ka ọ bụrụ "mkparị". Opekempe, PRNG dị otú ahụ adịghị mma maka ịmepụta nhazi na ụgbọ elu.

Usoro ọzọ:

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

Ihe niile dị ka ọ dị mma ebe a ọbụlagodi na ụgbọ elu:
BlessRNG ma ọ bụ lelee RNG maka izi ezi
Ka anyị leba anya n'olu (gụọ ọnụọgụ atọ n'otu oge):
BlessRNG ma ọ bụ lelee RNG maka izi ezi
Na ọzọ ụkpụrụ. Ọ gaghịkwa ekwe omume iwupụta ọhụụ na akụkụ anọ. Ma ụkpụrụ nwere ike ịdị na akụkụ a na ndị buru ibu.

Na cryptography, ebe a na-etinye iwu siri ike na PRNG, ọnọdụ dị otú ahụ bụ nke anabataghị nke ọma. Ya mere, e mepụtala algọridim pụrụ iche iji nyochaa àgwà ha, nke anyị agaghị emetụ aka ugbu a. Isiokwu a sara mbara ma kwesịkwa ide edemede dị iche.

Ule

Ọ bụrụ na anyị amaghị ihe n'ezie, mgbe ahụ ka esi arụ ọrụ na ya? Ọ bara uru ịgafe okporo ụzọ ma ọ bụrụ na ị maghị nke ọkụ okporo ụzọ na-enye ya ohere? Ihe ga-esi na ya pụta nwere ike ịdị iche.

Otu na-aga maka ama ama randomness na Unity. Ọ dị mma ma ọ bụrụ na akwụkwọ ahụ gosipụtara nkọwa ndị dị mkpa, ma akụkọ ahụ a kpọtụrụ aha na mmalite nke isiokwu ahụ mere kpọmkwem n'ihi enweghị nkọwa a chọrọ.

Ma ọ bụrụ na ịmaghị ka ngwá ọrụ ahụ si arụ ọrụ, ị gaghị enwe ike iji ya mee ihe nke ọma. N'ozuzu, oge eruola iji lelee ma mee nnwale iji mee ka n'ikpeazụ jide n'aka na ọ dịkarịa ala banyere nkesa.

Ihe ngwọta dị mfe ma dị irè - na-anakọta ọnụ ọgụgụ, nweta data ebumnobi ma lelee nsonaazụ ya.

Isiokwu ọmụmụ

Enwere ụzọ dị iche iche isi mepụta ọnụọgụ na-enweghị usoro na Unity - anyị nwalere ise.

  1. Sistemu.Random.Ọzọ(). Na-emepụta ọnụọgụgụ n'ụdị ụkpụrụ enyerela.
  2. Sistemu.Random.NextDouble(). Na-emepụta ọnụọgụ ziri ezi okpukpu abụọ n'ogo site na [0; 1).
  3. UnityEngine.Random.Range(). Na-ewepụta ọnụọgụ ziri ezi (ese n'elu) n'ụdị ụkpụrụ enyere.
  4. UnityEngine.Random.uru. Na-ewepụta ọnụọgụ ziri ezi nke otu (floats) na nso site na [0; 1).
  5. Ịdị n'otu.Mathematics.Random.NextFloat(). Akụkụ nke ọbá akwụkwọ Unity.Mathematics ọhụrụ. Na-ewepụta ọnụọgụ ziri ezi (ese n'elu) n'ụdị ụkpụrụ enyere.

Ihe fọrọ nke nta ka ọ bụrụ ebe niile na akwụkwọ ahụ ka akọwapụtara nkesa otu, ma ewezuga UnityEngine.Random.value (ebe a na-akọwaghị nkesa ya, mana site na ntụnyere na UnityEngine.Random.Range() uniform na-atụkwa anya na Unity.Mathematics.Random. .NextFloat () (ebe na ndabere bụ xorshift algọridim, nke pụtara na ọzọ ị ga-echere a edo nkesa).

Site na ndabara, a na-ewere nsonaazụ a tụrụ anya dị ka nke akọwapụtara na akwụkwọ ahụ.

Usoro

Anyị dere obere ngwa na-emepụta usoro nke ọnụọgụ ọnụọgụ na-eji nke ọ bụla n'ime ụzọ ewepụtara wee chekwaa nsonaazụ ya maka nhazi ọzọ.

Ogologo usoro nke ọ bụla bụ ọnụọgụ 100.
Ọnụọgụ ọnụọgụgụ enweghị usoro bụ [0).

Ewekọtara data site na ọtụtụ nyiwe ebumnuche:

  • Windows
    - Ịdị n'otu v2018.3.14f1, Ụdị nchịkọta akụkọ, Mono, .NET Standard 2.0
  • MacOS
    - Ịdị n'otu v2018.3.14f1, Ụdị nchịkọta akụkọ, Mono, .NET Standard 2.0
    - Ịdị n'otu v5.6.4p4, Ụdị nchịkọta akụkọ, Mono, .NET Standard 2.0
  • android
    - Ịdị n'otu v2018.3.14f1, wuo kwa ngwaọrụ, Mono, .NET Standard 2.0
  • iOS
    - Ịdị n'otu v2018.3.14f1, wuo kwa ngwaọrụ, il2cpp, .NET Standard 2.0

Mmejuputa iwu

Anyị nwere ụzọ dị iche iche isi wepụta ọnụọgụgụ enweghị usoro. Maka nke ọ bụla n'ime ha, anyị ga-ede klas nke ihe mkpuchi dị iche, nke kwesịrị inye:

  1. Enwere ike ịtọ oke ụkpụrụ [min/max). A ga-edozi site na onye nrụpụta.
  2. Usoro iweghachi MF. Ka anyị họrọ ise n'elu dị ka ụdị, dị ka ọ bụ ihe n'ozuzu.
  3. Aha nke usoro ọgbọ maka akara nsonaazụ. Maka ịdị mma, anyị ga-alaghachi dị ka uru aha zuru ezu nke klas + aha usoro eji eme MF.

Nke mbu, ka anyi kwuputa abstraction nke IRandomGenerator interface ga-anọchi anya ya:

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

        float Generate();
    }
}

Mmejuputa Sistemu.Random.Ọzọ()

Usoro a na-enye gị ohere ịtọ ụkpụrụ dị iche iche, mana ọ na-eweghachite integers, mana ọ dị mkpa n'elu mmiri. Ị nwere ike ịkọwa integer dị ka mmiri na-ese n'elu, ma ọ bụ ị nwere ike ịgbasa ụkpụrụ dị iche iche site n'ọtụtụ iwu dị ukwuu, na-akwụghachi ha na ọgbọ ọ bụla nke midrange. Nsonaazụ ga-abụ ihe dị ka ebe a kapịrị ọnụ nwere usoro ziri ezi nyere. Anyị ga-eji nhọrọ a ebe ọ bụ na ọ dị nso na ezigbo float uru.

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

Mmejuputa Sistemu.Random.NextDouble()

Ebe a kapịrị ọnụ nke ụkpụrụ [0; 1). Iji tinye ya na nke akọwapụtara na onye nrụpụta, anyị na-eji mgbakọ dị mfe: 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;
    }
}

Mmejuputa UnityEngine.Random.Range()

Usoro a nke UnityEngine.Random static class na-enye gị ohere ịtọ ụkpụrụ dị iche iche ma weghachite ụdị nke ise n'elu mmiri. Ị gaghị eme mgbanwe ọ bụla ọzọ.

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

Mmejuputa UnityEngine.Random.uru

Ngwongwo bara uru nke klaasị static UnityEngine.Random na-eweghachi ụdị ese n'elu site n'ọtụtụ ụkpụrụ [0; 1). Ka anyị tinye ya n'usoro enyere n'otu ụzọ ahụ mgbe ị na-emejuputa 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;
    }
}

Mmezu nke ịdị n'otu.Mathematics.Random.NextFloat()

Usoro NextFloat () nke Unity.Mathematics.Random klas na-eweghachite ebe na-ese n'elu ụdị float ma na-enye gị ohere ịkọwapụta ụkpụrụ dị iche iche. Naanị nuance bụ na ihe atụ ọ bụla nke Unity.Mathematics.Random ga-eji mkpụrụ ụfọdụ malite - otu a anyị ga-ezere imepụta usoro ugboro ugboro.

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

Mmejuputa MainController

Ọtụtụ mmejuputa iwu nke IRandomGenerator adịla njikere. Na-esote, ịkwesịrị ịmepụta usoro wee chekwaa dataset ga-arụpụta maka nhazi. Iji mee nke a, anyị ga-emepụta ihe nkiri na obere edemede MainController na Unity, nke ga-arụ ọrụ niile dị mkpa ma n'otu oge ahụ na-ahụ maka mmekọrịta na UI.

Ka anyị tọọ nha nke dataset yana oke ụkpụrụ MF, ma nwetakwa usoro na-eweghachite ọtụtụ igwe na-emepụta ihe ahaziri ma dị njikere ịrụ ọrụ.

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

        ...
    }
}

Ugbu a, ka anyị mepụta dataset. N'okwu a, a ga-ejikọta ọgbọ data na ịdekọ nsonaazụ n'ime iyi ederede (na csv usoro). Iji chekwaa ụkpụrụ nke IRandomGenerator ọ bụla, a na-ekenye kọlụm nke ya dị iche iche, ahịrị nke mbụ nwere aha onye nrụpụta.

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

        ...
    }
}

Naanị ihe fọdụrụ bụ ịkpọ usoro GenerateCsvDataSet wee chekwaa nsonaazụ ya na faịlụ, ma ọ bụ bufee data ozugbo na netwọkụ site na ngwaọrụ ngwụcha gaa na nkesa nnata.

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

        ...
    }
}

Isi mmalite ọrụ dị na GitLab.

Результаты

Ọ dịghị ọrụ ebube mere. Ihe ha tụrụ anya ya bụ ihe ha nwetara - n'ọnọdụ niile, nkesa ọbụna n'enweghị ihe ọ bụla nke nkata. Ahụghị m isi ihe ọ bụla na ịgbakwunye eserese dị iche iche maka nyiwe - ha niile na-egosi ihe dị ka otu nsonaazụ.

Nke bụ eziokwu bụ:
BlessRNG ma ọ bụ lelee RNG maka izi ezi

Ịhụ usoro n'ụgbọelu site na usoro ọgbọ ise niile:
BlessRNG ma ọ bụ lelee RNG maka izi ezi

Na ikiri ihe na 3D. M ga-ahapụ naanị nsonaazụ nke System.Random.Next () ka ọ ghara ịmepụta ụyọkọ ọdịnaya.
BlessRNG ma ọ bụ lelee RNG maka izi ezi

Akụkọ ahụ kwuru na mmalite banyere nkesa nkịtị nke UnityEngine.Random emeghịghachi onwe ya: ma ọ bụ na mbụ ezighi ezi, ma ọ bụ ihe agbanweela na engine. Ma ugbu a, anyị ji n'aka.

isi: www.habr.com

Tinye a comment