BlessRNG lossis tshawb xyuas RNG kom ncaj ncees

BlessRNG lossis tshawb xyuas RNG kom ncaj ncees

Hauv kev txhim kho kev ua si, koj feem ntau yuav tsum tau khi ib yam dab tsi nrog randomness: Kev sib sau muaj nws tus kheej Random rau qhov no, thiab nyob rau tib lub sijhawm nrog nws muaj System.Random. Ib zaug ib zaug, ntawm ib qho ntawm cov haujlwm, kuv tau txais kev xav tias ob qho tib si tuaj yeem ua haujlwm sib txawv (txawm tias lawv yuav tsum muaj kev faib tawm).

Tom qab ntawd lawv tsis mus rau hauv cov ntsiab lus - nws yog txaus tias qhov kev hloov mus rau System.Random kho tag nrho cov teeb meem. Tam sim no peb tau txiav txim siab los saib rau hauv nws kom nthuav dav ntxiv thiab ua kev tshawb fawb me ntsis: yuav ua li cas "kev coj ncaj ncees" lossis kev kwv yees RNGs yog dab tsi, thiab xaiv qhov twg. Tsis tas li ntawd, kuv muaj ntau tshaj ib zaug tau hnov ​​​​cov lus tsis sib haum xeeb txog lawv "kev ncaj ncees" - cia peb sim seb qhov txiaj ntsig tiag tiag piv nrog cov lus tshaj tawm li cas.

Kev kawm luv luv lossis RNG yog RNG tiag

Yog tias koj twb paub txog tus lej random generators, ces koj tuaj yeem hla mus rau ntu "Testing".

Random naj npawb (RN) yog ib ntu ntawm cov lej tsim los siv qee cov txheej txheem random (chaotic), qhov chaw ntawm entropy. Ntawd yog, qhov no yog ib ntus uas nws cov ntsiab lus tsis sib cuam tshuam los ntawm ib qho kev cai lej - lawv tsis muaj kev sib raug zoo ua rau thiab cuam tshuam.

Dab tsi tsim tus lej random hu ua random tooj generator (RNG). Nws yuav zoo li tias txhua yam yog theem pib, tab sis yog tias peb txav los ntawm txoj kev xav mus rau kev xyaum, ces qhov tseeb nws tsis yooj yim rau kev siv software algorithm rau kev tsim ib ntu.

Yog vim li cas nyob rau hauv qhov tsis muaj qhov chaos tib yam hauv cov khoom siv hluav taws xob niaj hnub no. Yog tsis muaj nws, random tooj yuav tsum tsis txhob random, thiab lawv lub tshuab hluav taws xob hloov mus rau hauv ib qho kev ua haujlwm zoo ib yam ntawm cov lus pom tseeb. Rau ntau qhov tshwj xeeb hauv IT teb, qhov no yog qhov teeb meem loj (piv txwv li, cryptography), tab sis rau lwm tus muaj kev daws teeb meem zoo.

Nws yog ib qho tsim nyog los sau cov algorithm uas yuav rov qab los, txawm hais tias tsis yog tus lej random tiag tiag, tab sis ze li sai tau rau lawv - tus lej hu ua pseudo-random tooj (PRN). Lub algorithm nyob rau hauv cov ntaub ntawv no yog hu ua ib tug pseudorandom tooj generator (PRNG).

Muaj ntau ntau txoj hauv kev los tsim PRNG, tab sis cov hauv qab no yuav cuam tshuam rau txhua tus:

  1. Qhov xav tau rau kev pib ua ntej.

    PRNG tsis muaj qhov chaw ntawm entropy, yog li nws yuav tsum tau muab lub xeev thawj zaug ua ntej siv. Nws raug teev raws li tus lej (lossis vector) thiab hu ua noob (cov noob random). Feem ntau, lub processor moos txee lossis tus lej sib npaug ntawm lub sijhawm siv los ua cov noob.

  2. Ua raws li kev tsim tawm.

    Lub PRNG yog kev txiav txim siab tag nrho, yog li cov noob tau teev tseg thaum pib ua haujlwm tshwj xeeb txiav txim siab tag nrho cov lej yav tom ntej. Qhov no txhais tau hais tias ib qho kev sib cais PRNG pib nrog tib lub noob (ntawm lub sijhawm sib txawv, hauv cov kev pabcuam sib txawv, ntawm cov khoom siv sib txawv) yuav tsim kom muaj tib lub sijhawm.

Koj kuj yuav tsum paub qhov tshwm sim ntawm qhov kev faib tawm yam ntxwv ntawm PRNG - tus lej twg nws yuav tsim thiab muaj qhov tshwm sim zoo li cas. Feem ntau qhov no yog ib qho kev faib tawm ib txwm lossis ib qho kev faib tawm.
BlessRNG lossis tshawb xyuas RNG kom ncaj ncees
Kev faib tawm ib txwm (sab laug) thiab sib faib (txoj cai)

Wb hais tias peb muaj kev ncaj ncees tuag nrog 24 sab. Yog tias koj pov nws, qhov tshwm sim ntawm qhov tau txais ib qho yuav sib npaug rau 1/24 (tib yam li qhov tshwm sim tau txais lwm tus lej). Yog tias koj ua ntau qhov cuam tshuam thiab sau cov txiaj ntsig, koj yuav pom tias tag nrho cov npoo poob nrog kwv yees li tib zaus. Qhov tseem ceeb, qhov tuag no tuaj yeem suav tias yog RNG nrog kev faib khoom sib xws.

Yuav ua li cas yog tias koj pov 10 ntawm cov tsuav no ib zaug thiab suav tag nrho cov ntsiab lus? Puas yuav muaj kev sib haum xeeb rau nws? Tsis muaj. Feem ntau, tus nqi yuav nyob ze rau 125 cov ntsiab lus, uas yog, rau qee tus nqi nruab nrab. Thiab yog li ntawd, txawm tias ua ntej muab pov, koj tuaj yeem kwv yees qhov tshwm sim yav tom ntej.

Yog vim li cas yog tias muaj ntau qhov sib xyaw ua ke kom tau txais qhov qhab nia nruab nrab. Qhov deb ntawm nws, qhov sib txuas tsawg dua - thiab, raws li, qhov tsawg dua qhov yuav poob. Yog tias cov ntaub ntawv no pom, nws yuav vaguely zoo li lub tswb. Yog li ntawd, nrog qee qhov ncab, lub kaw lus ntawm 10 tsuav tuaj yeem hu ua RNG nrog kev faib tawm ib txwm.

Lwm qhov piv txwv, tsuas yog lub sijhawm no ntawm lub dav hlau - tua ntawm lub hom phiaj. Tus tua yuav yog RNG uas tsim ib khub ntawm tus lej (x, y) uas tshwm rau ntawm daim duab.
BlessRNG lossis tshawb xyuas RNG kom ncaj ncees
Pom zoo tias qhov kev xaiv ntawm sab laug yog ze rau lub neej tiag tiag - qhov no yog RNG nrog kev faib tawm ib txwm muaj. Tab sis yog tias koj xav tau tawg cov hnub qub hauv lub ntuj tsaus, ces qhov kev xaiv zoo, tau siv RNG nrog kev faib tawm, yog qhov zoo dua. Feem ntau, xaiv lub tshuab hluav taws xob nyob ntawm txoj haujlwm ntawm tes.

Tam sim no cia peb tham txog qhov entropy ntawm PNG ib ntus. Piv txwv li, muaj ib ntu uas pib zoo li no:

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

Yuav ua li cas random yog cov lej ntawm thawj glance? Cia peb pib los ntawm kev txheeb xyuas qhov kev faib tawm.
BlessRNG lossis tshawb xyuas RNG kom ncaj ncees
Nws zoo nkaus li zoo ib yam, tab sis yog tias koj nyeem ib ntu ntawm ob tus lej thiab txhais lawv li kev sib koom ua ke ntawm lub dav hlau, koj tau txais qhov no:
BlessRNG lossis tshawb xyuas RNG kom ncaj ncees
Cov qauv ua kom pom tseeb. Thiab txij li thaum cov ntaub ntawv nyob rau hauv ib ntus raug txiav txim nyob rau hauv ib txoj kev (uas yog, nws muaj qis entropy), qhov no tuaj yeem ua rau muaj qhov "kev tsis ncaj ncees". Yam tsawg kawg nkaus, xws li PRNG tsis haum rau tsim cov kev sib koom ua ke ntawm lub dav hlau.

Lwm cov kab ke:

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

Txhua yam zoo li zoo ntawm no txawm nyob hauv lub dav hlau:
BlessRNG lossis tshawb xyuas RNG kom ncaj ncees
Cia peb saib hauv ntim (nyeem peb tus lej ib zaug):
BlessRNG lossis tshawb xyuas RNG kom ncaj ncees
Thiab dua cov qauv. Nws tsis muaj peev xwm tsim kom pom qhov pom hauv plaub qhov ntev. Tab sis cov qauv tuaj yeem muaj nyob rau ntawm qhov loj me thiab loj dua.

Nyob rau hauv cryptography, qhov twg cov kev cai nruj tshaj plaws yog yuam rau PRNGs, xws li qhov xwm txheej yog categorically tsis tsim nyog. Yog li ntawd, tshwj xeeb algorithms tau tsim los ntsuas lawv qhov zoo, uas peb yuav tsis kov tam sim no. Lub ntsiab lus yog dav thiab tsim nyog ib tsab xov xwm cais.

Kev Ntsuam Xyuas

Yog tias peb tsis paub qee yam tseeb, ces yuav ua li cas nrog nws? Puas tsim nyog hla txoj kev yog tias koj tsis paub tias lub teeb pom kev twg tso cai rau nws? Cov kev tshwm sim yuav txawv.

Ib yam mus rau qhov tsis zoo randomness hauv Unity. Nws yog qhov zoo yog tias cov ntaub ntawv nthuav tawm cov ntsiab lus tsim nyog, tab sis zaj dab neeg tau hais thaum pib ntawm tsab xov xwm tau tshwm sim meej vim tsis muaj qhov xav tau tshwj xeeb.

Thiab yog tias koj tsis paub tias lub cuab yeej ua haujlwm li cas, koj yuav tsis tuaj yeem siv nws kom raug. Feem ntau, lub sijhawm tau los xyuas thiab ua ib qho kev sim kom paub tseeb tias yam tsawg kawg ntawm kev faib khoom.

Kev daws tau yooj yim thiab ua tau zoo - sau cov txheeb cais, tau txais cov ntaub ntawv lub hom phiaj thiab saib cov txiaj ntsig.

Kev kawm

Muaj ob peb txoj hauv kev los tsim cov lej random hauv Unity - peb tau sim tsib.

  1. System.Random.Next(). Tsim cov integers nyob rau hauv ib tug muab ntau yam ntawm cov nqi.
  2. System.Random.NextDouble(). Tsim ob npaug ntawm tus lej hauv qhov ntau ntawm [0; 1).
  3. UnityEngine.Random.Range(). Tsim ib tus lej precision (floats) nyob rau hauv ntau yam ntawm qhov muaj nqis.
  4. UnityEngine.Random.value. Tsim ib tus lej precision (floats) hauv thaj tsam ntawm [0; 1).
  5. Unity.Mathematics.Random.NextFloat(). Ib feem ntawm lub tsev qiv ntawv Unity.Mathematics tshiab. Tsim ib tus lej precision (floats) nyob rau hauv ntau yam ntawm qhov muaj nqis.

Yuav luag txhua qhov chaw hauv cov ntaub ntawv ib qho kev faib tawm tsis sib xws, tshwj tsis yog UnityEngine.Random.value (qhov kev faib tsis tau teev tseg, tab sis los ntawm kev sib piv nrog UnityEngine.Random.Range() uniform kuj xav tau) thiab Unity.Mathematics.Random. .NextFloat() (qhov twg nyob rau hauv lub hauv paus yog xorshift algorithm, uas txhais tau hais tias dua koj yuav tsum tau tos ib tug uniform tis).

Los ntawm lub neej ntawd, cov txiaj ntsig xav tau raug coj los ua raws li tau teev tseg hauv cov ntaub ntawv.

Txoj kev

Peb tau sau ib daim ntawv thov me me uas tau tsim cov kab ke ntawm cov lej random siv txhua txoj kev qhia thiab khaws cov txiaj ntsig rau kev ua haujlwm ntxiv.

Qhov ntev ntawm txhua ntu yog 100 tus lej.
Qhov ntau ntawm cov lej random yog [0, 100).

Cov ntaub ntawv tau sau los ntawm ntau lub hom phiaj platform:

  • lub qhov rais
    - Kev sib sau v2018.3.14f1, Editor hom, Mono, .NET Standard 2.0
  • MacOS
    - Kev sib sau v2018.3.14f1, Editor hom, Mono, .NET Standard 2.0
    - Kev sib sau v5.6.4p4, Editor hom, Mono, .NET Standard 2.0
  • Android
    - Kev sib sau v2018.3.14f1, tsim ib lub cuab yeej, Mono, .NET Standard 2.0
  • iOS
    - Kev sib sau v2018.3.14f1, tsim ib lub cuab yeej, il2cpp, .NET Standard 2.0

Kev siv

Peb muaj ntau txoj hauv kev los tsim cov lej random. Rau txhua tus ntawm lawv, peb yuav sau ib chav wrapper cais, uas yuav tsum muab:

  1. Muaj peev xwm teeb tsa qhov ntau ntawm qhov muaj nuj nqis [min/max). Yuav teem los ntawm tus tsim.
  2. Txoj kev rov qab MF. Cia peb xaiv ntab raws li hom, raws li nws yog dav dav.
  3. Lub npe ntawm txoj kev tiam rau kev kos cov txiaj ntsig. Txhawm rau kom yooj yim, peb yuav rov qab los ua tus nqi tag nrho lub npe ntawm chav kawm + lub npe ntawm txoj kev siv los tsim MF.

Ua ntej, cia peb tshaj tawm qhov kev paub daws teeb meem uas yuav sawv cev los ntawm IRandomGenerator interface:

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

        float Generate();
    }
}

Kev siv ntawm System.Random.Next()

Txoj kev no tso cai rau koj los teeb tsa ntau qhov txiaj ntsig, tab sis nws rov qab cov lej, tab sis floats xav tau. Koj tuaj yeem txhais cov lej ntau raws li ntab, lossis koj tuaj yeem nthuav dav ntau qhov txiaj ntsig los ntawm ntau qhov kev txiav txim ntawm qhov loj, them nyiaj rau lawv nrog txhua tiam ntawm nruab nrab. Qhov tshwm sim yuav yog ib yam dab tsi zoo li qhov chaw ruaj khov nrog rau qhov kev txiav txim ntawm qhov raug. Peb yuav siv qhov kev xaiv no vim nws yog ze rau tus nqi ntab tiag tiag.

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

Kev siv ntawm System.Random.NextDouble()

Ntawm no qhov chaw ruaj khov ntawm qhov muaj nuj nqis [0; 1). Txhawm rau ua nws mus rau qhov tau teev tseg hauv tus tsim, peb siv cov lej lej yooj yim: 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;
    }
}

Kev siv UnityEngine.Random.Range()

Txoj kev no ntawm UnityEngine.Random static chav kawm tso cai rau koj los teeb tsa ntau qhov txiaj ntsig thiab xa rov qab hom ntab. Koj tsis tas yuav ua ib qho kev hloov pauv ntxiv.

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

Kev siv UnityEngine.Random.value

Tus nqi khoom ntawm cov chav kawm zoo li qub UnityEngine.Random rov qab ib hom ntab los ntawm qhov chaw ruaj khov ntawm qhov muaj nuj nqis [0; 1). Cia peb ua nws mus rau qhov muab ntau yam tib yam li thaum siv 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;
    }
}

Kev siv Unity.Mathematics.Random.NextFloat()

Lub NextFloat() txoj kev ntawm Unity.Mathematics.Random chav kawm rov qab ib qho chaw ntab ntawm hom ntab thiab tso cai rau koj los qhia txog ntau yam ntawm qhov tseem ceeb. Qhov tsuas yog nuance yog tias txhua qhov piv txwv ntawm Unity.Mathematics.Random yuav tsum tau pib nrog qee cov noob - txoj kev no peb yuav tsis txhob tsim cov txheej txheem rov ua dua.

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

Kev siv ntawm MainController

Ntau qhov kev siv ntawm IRandomGenerator yog npaj txhij. Tom ntej no, koj yuav tsum tau tsim cov sequences thiab txuag lub resulting dataset rau ua. Txhawm rau ua qhov no, peb yuav tsim ib qho chaw thiab ib tsab ntawv me me ntawm MainController hauv Unity, uas yuav ua txhua yam haujlwm tsim nyog thiab tib lub sijhawm yog lub luag haujlwm rau kev cuam tshuam nrog UI.

Cia peb teeb tsa qhov loj ntawm dataset thiab qhov ntau ntawm MF qhov tseem ceeb, thiab tseem tau txais ib txoj hauv kev uas xa rov qab cov khoom siv hluav taws xob tau teeb tsa thiab npaj ua haujlwm.

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

        ...
    }
}

Tam sim no cia peb tsim cov ntaub ntawv. Hauv qhov no, cov ntaub ntawv tsim tawm yuav muab ua ke nrog kev sau cov txiaj ntsig rau hauv cov ntawv nyeem (hauv csv hom). Txhawm rau khaws cov txiaj ntsig ntawm txhua IRandomGenerator, nws tus kheej kem cais tau faib, thiab thawj kab muaj lub npe ntawm lub tshuab hluav taws xob.

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

        ...
    }
}

Txhua yam uas tseem tshuav yog hu rau GenerateCsvDataSet txoj kev thiab txuag qhov tshwm sim rau hauv cov ntaub ntawv, lossis tam sim hloov cov ntaub ntawv hla lub network los ntawm qhov kawg ntaus ntawv mus rau qhov tau txais server.

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

        ...
    }
}

Qhov project qhov chaw nyob ntawm GitLab.

Результаты

Tsis muaj txuj ci tseem ceeb tshwm sim. Qhov lawv xav tau yog qhov lawv tau txais - nyob rau hauv txhua rooj plaub, ib qho kev faib tawm txawm tias tsis muaj lus pom ntawm kev koom ua ke. Kuv tsis pom ib qho twg hauv kev ntxiv cov duab sib cais rau cov platforms - lawv txhua tus qhia kwv yees li qhov txiaj ntsig zoo ib yam.

Qhov tseeb yog:
BlessRNG lossis tshawb xyuas RNG kom ncaj ncees

Visualization ntawm sequences ntawm ib lub dav hlau los ntawm tag nrho tsib tiam txoj kev:
BlessRNG lossis tshawb xyuas RNG kom ncaj ncees

Thiab visualization hauv 3D. Kuv mam li tawm tsuas yog qhov tshwm sim ntawm System.Random.Next() thiaj li tsis tsim ib pawg ntawm cov ntsiab lus zoo ib yam.
BlessRNG lossis tshawb xyuas RNG kom ncaj ncees

Zaj dab neeg tau hais nyob rau hauv cov lus qhia txog kev faib tawm ib txwm muaj ntawm UnityEngine.Random tsis rov ua nws tus kheej: txawm tias nws tau pib ua yuam kev, lossis qee yam tau hloov pauv hauv lub cav txij li thaum pib. Tab sis tam sim no peb paub tseeb.

Tau qhov twg los: www.hab.com

Ntxiv ib saib