BlessRNG a nānā paha i ka RNG no ka pololei

BlessRNG a nānā paha i ka RNG no ka pololei

I ka hoʻomohala pāʻani, pono pinepine ʻoe e hoʻopaʻa i kahi mea me ka randomness: Aia ka Unity i kāna Random ponoʻī no kēia, a ma ka like me ia aia ʻo System.Random. I kekahi manawa, ma kekahi o nā papahana, ua loaʻa iaʻu ka manaʻo e hiki ke hana ʻokoʻa nā mea ʻelua (ʻoiai he pono ka puʻunaue like).

A laila ʻaʻole lākou i hele i nā kikoʻī - ua lawa ka hoʻololi ʻana i System.Random i hoʻoponopono i nā pilikia āpau. I kēia manawa ua hoʻoholo mākou e nānā i nā kikoʻī hou aʻe a hana i kahi noiʻi liʻiliʻi: pehea ka "biased" a i ʻole nā ​​​​RNGs wānana, a ʻo wai ka mea e koho ai. Eia kekahi, ua lohe au i nā manaʻo kū'ē e pili ana i kā lākou "ʻoiaʻiʻo" - e hoʻāʻo mākou e ʻike pehea e hoʻohālikelike ai nā hopena maoli me nā mea i haʻi ʻia.

ʻO ka papahana hoʻonaʻauao pōkole a i ʻole RNG maoli ʻo RNG

Inā ua kamaʻāina ʻoe i nā mea hoʻomohala helu maʻamau, a laila hiki iā ʻoe ke lele koke i ka ʻāpana "Hoʻāʻo".

ʻO nā helu kuhi (RN) he kaʻina o nā helu i hana ʻia me ka hoʻohana ʻana i kekahi kaʻina hana (chaotic), kahi kumu o ka entropy. ʻO ia hoʻi, he kaʻina kēia i pili ʻole ʻia nā mea e kekahi kānāwai makemakika - ʻaʻohe pili kumu a me ka hopena.

ʻO ka mea e hana ai i ka helu maʻamau, ua kapa ʻia ʻo ia he mea hoʻoheheʻe helu random (RNG). Me he mea lā he mea haʻahaʻa nā mea a pau, akā inā e neʻe mākou mai ke kumumanaʻo i ka hoʻomaʻamaʻa, a laila ʻaʻole maʻalahi ka hoʻokō ʻana i kahi polokalamu algorithm no ka hana ʻana i kēlā ʻano.

Aia ke kumu i ka loaʻa ʻole o kēlā haunaele i nā mea hoʻohana uila hou. Me ka ʻole o ia, pau ka helu ʻole ʻana i ka helu ʻole, a lilo kā lākou mea hana i hana maʻamau o nā manaʻo i wehewehe ʻia. No ka nui o nā mea kūikawā ma ke kahua IT, he pilikia koʻikoʻi kēia (no ka laʻana, cryptography), akā no nā poʻe ʻē aʻe he hopena kūpono loa.

Pono e kākau i kahi algorithm e hoʻihoʻi mai, ʻaʻole naʻe i nā helu maʻamau, akā kokoke loa iā lākou - ka mea i kapa ʻia ʻo pseudo-random numbers (PRN). Ua kapa ʻia ka algorithm i kēia hihia he pseudorandom number generator (PRNG).

Nui nā koho no ka hana ʻana i kahi PRNG, akā pili kēia i nā mea a pau:

  1. Ka pono no ka hoʻomaka mua.

    ʻAʻohe kumu o ka entropy o ka PRNG, no laila pono e hāʻawi ʻia i kahi kūlana mua ma mua o ka hoʻohana ʻana. Hōʻike ʻia ʻo ia ma ke ʻano he helu (a i ʻole vector) a ua kapa ʻia ʻo ia he ʻanoʻano (anoano kumu ʻole). ʻO ka manawa pinepine, hoʻohana ʻia ka mea hoʻohana i ka uaki kaʻina hana a i ʻole ka helu helu like o ka manawa ʻōnaehana ma ke ʻano he hua.

  2. Ka hoʻopuka hou ʻana.

    Hoʻoholo paʻa loa ka PRNG, no laila ʻo ka hua i ʻōlelo ʻia i ka wā hoʻomaka e hoʻoholo kūʻokoʻa i ke kaʻina holoʻokoʻa o nā helu e hiki mai ana. ʻO ia ke ʻano o kahi PRNG kaʻawale i hoʻomaka me ka hua like (i nā manawa like ʻole, ma nā papahana like ʻole, ma nā ʻaoʻao like ʻole) e hoʻohua i ke kaʻina like.

Pono ʻoe e ʻike i ka puʻunaue likelika e hōʻike ana i ka PRNG - he aha nā helu e hoʻopuka ai a me ke ʻano like ʻole. ʻO ka hapanui pinepine, he puʻunaue maʻamau a i ʻole ka puʻunaue like.
BlessRNG a nānā paha i ka RNG no ka pololei
Puunaue maʻamau (hema) a me ka puunaue like (akau)

E ʻōlelo kākou he make kūpono me 24 ʻaoʻao. Inā hoʻolei ʻoe iā ia, e like ka like me ka 1/24 (e like me ka loaʻa ʻana o kekahi helu ʻē aʻe). Inā hoʻolei ʻoe a hoʻopaʻa i nā hopena, e ʻike ʻoe i ka hāʻule ʻana o nā kihi a pau me ka like like. ʻO ka mea nui, hiki ke manaʻo ʻia kēia make he RNG me ka hāʻawi like ʻana.

Pehea inā hoʻolei ʻoe i 10 o kēia mau dice i ka manawa hoʻokahi a helu i nā helu āpau? E mālama ʻia ka lokahi no ia? ʻAʻole. ʻO ka pinepine, e kokoke ana ka nui i nā helu 125, ʻo ia hoʻi, i kekahi waiwai awelika. A ʻo ka hopena, ma mua o ka hoʻolei ʻana, hiki iā ʻoe ke hoʻohālikelike i ka hopena e hiki mai ana.

ʻO ke kumu, aia ka nui o nā hui e loaʻa ai ka helu awelika. ʻO ka mamao loa mai ia mea, ʻo nā hui liʻiliʻi - a, no laila, ʻoi aku ka haʻahaʻa o ka pohō. Inā ʻike ʻia kēia ʻikepili, e like me ke ʻano o ka bele. No laila, me kahi kikoʻī, hiki ke kapa ʻia kahi ʻōnaehana o 10 dice he RNG me ka puʻunaue maʻamau.

ʻO kekahi laʻana, i kēia manawa wale nō ma ka mokulele - pana i kahi pahu hopu. ʻO ka mea pana pana he RNG e hoʻopuka ana i nā helu pālua (x, y) i hōʻike ʻia ma ka pakuhi.
BlessRNG a nānā paha i ka RNG no ka pololei
E ʻae e pili ana ka koho ma ka hema i ke ola maoli - he RNG kēia me ka puʻunaue maʻamau. Akā inā pono ʻoe e hoʻopuehu i nā hōkū i ka lani ʻeleʻele, a laila ʻoi aku ka maikaʻi o ke koho kūpono, i loaʻa me ka hoʻohana ʻana i ka RNG me ka hāʻawi like ʻana. Ma keʻano laulā, koho i kahi mīkini hana ma muli o ka hana ma ka lima.

I kēia manawa e kamaʻilio e pili ana i ka entropy o ke kaʻina PNG. Eia kekahi laʻana, aia kahi kaʻina e hoʻomaka e like me kēia:

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

Pehea ka maʻamau o kēia mau helu i ka nānā mua ʻana? E hoʻomaka kākou ma ka nānā ʻana i ka puʻunaue.
BlessRNG a nānā paha i ka RNG no ka pololei
Kokoke ia i ka ʻaʻahu, akā inā heluhelu ʻoe i ke kaʻina o nā helu ʻelua a wehewehe iā lākou ma ke ʻano he hoʻonohonoho ma ka mokulele, loaʻa iā ʻoe kēia:
BlessRNG a nānā paha i ka RNG no ka pololei
ʻIke maopopo ʻia nā hiʻohiʻona. A no ka mea ua kauoha ʻia ka ʻikepili i ke kaʻina ma kekahi ʻano (ʻo ia hoʻi, he entropy haʻahaʻa), hiki i kēia ke hoʻāla i kēlā "bias". Ma ka liʻiliʻi loa, ʻaʻole kūpono kēlā PRNG no ka hoʻokumu ʻana i nā koina ma kahi mokulele.

ʻO kekahi kaʻina:

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

Me he mea lā ua maikaʻi nā mea a pau ma ka mokulele:
BlessRNG a nānā paha i ka RNG no ka pololei
E nānā kākou i ka leo (heluhelu ʻekolu helu i ka manawa hoʻokahi):
BlessRNG a nānā paha i ka RNG no ka pololei
A eia hou na mamana. ʻAʻole hiki ke kūkulu hou i kahi hiʻohiʻona ma nā ʻāpana ʻehā. Akā hiki ke loaʻa nā hiʻohiʻona ma kēia ana a ma luna o nā mea nui.

I ka cryptography, kahi i kau ʻia ai nā koi koʻikoʻi ma luna o PRNGs, ʻaʻole ʻae ʻia kēlā ʻano kūlana. No laila, ua hoʻomohala ʻia nā algorithm kūikawā e loiloi i ko lākou ʻano, ʻaʻole mākou e hoʻopā i kēia manawa. Nui ke kumuhana a pono i kahi ʻatikala kaʻawale.

Hoʻoponopono

Inā ʻaʻole mākou ʻike maopopo i kekahi mea, a laila pehea e hana ai me ia? He mea pono ke hele i ke alanui inā ʻaʻole ʻoe i ʻike i ke kukui uila e hiki ai? He ʻokoʻa paha nā hopena.

Pela no ka notorious randomness ma Unity. He maikaʻi inā hōʻike ka palapala i nā kikoʻī e pono ai, akā ʻo ka moʻolelo i haʻi ʻia ma ka hoʻomaka ʻana o ka ʻatikala i hana pololei ʻia ma muli o ka nele o nā kikoʻī i makemake ʻia.

A inā ʻaʻole ʻoe ʻike i ka hana ʻana o ka hāmeʻa, ʻaʻole hiki iā ʻoe ke hoʻohana pololei. Ma keʻano laulā, ua hiki mai ka manawa e nānā a hana i kahi hoʻokolohua e hōʻoia hope loa e pili ana i ka puʻunaue.

He maʻalahi a maikaʻi ka hopena - e hōʻiliʻili i nā ʻikepili, loaʻa ka ʻikepili pahuhopu a nānā i nā hopena.

Kumuhana a'o

Nui nā ala e hana ai i nā helu maʻamau i Unity - ua hoʻāʻo mākou i ʻelima.

  1. System.Random.Next(). Hoʻopuka i nā helu helu ma kahi ʻano waiwai.
  2. System.Random.NextDouble(). Hoʻopuka i nā helu kikoʻī pālua ma ka laulā mai [0; 1).
  3. UnityEngine.Random.Range(). Hoʻopuka i nā helu kikoʻī hoʻokahi (nā lana) ma kahi ʻano waiwai i hāʻawi ʻia.
  4. UnityEngine.Random.value. Hoʻopuka i nā helu kikoʻī hoʻokahi (nā lana) ma ka laulā mai [0; 1).
  5. Unity.Mathematics.Random.NextFloat(). Mahele o ka waihona Unity.Mathematics hou. Hoʻopuka i nā helu kikoʻī hoʻokahi (nā lana) ma kahi ʻano waiwai i hāʻawi ʻia.

Aneane ma na wahi a pau o ka palapala ua hoakakaia kekahi mahele like ole, koe nae ka UnityEngine.Random.value (kahi i hoakaka ole ia ai ka mahele ana, aka, ma ke ano hoohalike me UnityEngine.Random.Range() ua manaoia kekahi) a me Unity.Mathematics.Random .NextFloat () (ma kahi o ke kumu ʻo ka xorshift algorithm, ʻo ia hoʻi, pono ʻoe e kali no ka hāʻawi like ʻana).

Ma ka maʻamau, ua lawe ʻia nā hopena i manaʻo ʻia e like me nā mea i kuhikuhi ʻia ma ka palapala.

Poaʻina

Ua kākau mākou i kahi noi liʻiliʻi i hana i nā kaʻina o nā helu maʻamau me ka hoʻohana ʻana i kēlā me kēia ʻano i hōʻike ʻia a mālama i nā hopena no ka hana hou ʻana.

ʻO ka lōʻihi o kēlā me kēia kaʻina he 100 helu.
ʻO [0, 100 ka laula o nā helu maʻamau).

Ua hōʻiliʻili ʻia ka ʻikepili mai kekahi mau papa kuhikuhi:

  • Windows
    — Unity v2018.3.14f1, ke ano Lunahooponopono, Mono, .NET Standard 2.0
  • macOS
    — Unity v2018.3.14f1, ke ano Lunahooponopono, Mono, .NET Standard 2.0
    — Unity v5.6.4p4, ke ano Lunahooponopono, Mono, .NET Standard 2.0
  • Android
    — Unity v2018.3.14f1, kūkulu i kēlā me kēia mea, Mono, .NET Standard 2.0
  • IOS
    — Unity v2018.3.14f1, kūkulu i kēlā me kēia mea, il2cpp, .NET Standard 2.0

Ka hoʻokō

Loaʻa iā mākou nā ala like ʻole e hoʻohua ai i nā helu random. No kēlā me kēia o lākou, e kākau mākou i kahi papa wrapper kaʻawale, pono e hāʻawi:

  1. Hiki ke hoʻonohonoho i ka laulā o nā waiwai [min / max). E hoʻonoho ʻia ma o ka mea hana.
  2. Ke ala hoʻihoʻi MF. E koho kākou i ka lana e like me ke ʻano, no ka mea, ʻoi aku ka laulā.
  3. ʻO ka inoa o ke ʻano hana no ka hōʻailona ʻana i nā hopena. No ka maʻalahi, e hoʻihoʻi mākou ma ke ʻano he waiwai i ka inoa piha o ka papa + ka inoa o ke ʻano i hoʻohana ʻia e hana i ka MF.

ʻO ka mea mua, e haʻi aku i kahi abstraction e hōʻike ʻia e ka IRandomGenerator interface:

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

        float Generate();
    }
}

Hoʻokō o System.Random.Next()

Hāʻawi kēia ʻano iā ʻoe e hoʻonohonoho i nā ʻano waiwai, akā hoʻihoʻi ia i nā helu helu, akā pono nā lana. Hiki iā ʻoe ke wehewehe i ka integer ma ke ʻano he lana, a i ʻole hiki iā ʻoe ke hoʻonui i ka laulā o nā waiwai e nā kauoha o ka nui, e uku iā lākou me kēlā me kēia hanauna o ka midrange. ʻO ka hopena e like me kahi kiko paʻa me kahi kauoha i hāʻawi ʻia i ka pololei. E hoʻohana mākou i kēia koho no ka mea ua kokoke ia i ka waiwai lana maoli.

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

Hoʻokō o System.Random.NextDouble()

Eia ka laulā paʻa o nā waiwai [0; 1). No ka hoʻolālā ʻana ma luna o ka mea i kuhikuhi ʻia i ka mea hana, hoʻohana mākou i ka helu helu maʻalahi: 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;
    }
}

Hoʻokō o UnityEngine.Random.Range()

ʻO kēia ʻano o ka papa UnityEngine.Random static e hiki ai iā ʻoe ke hoʻonohonoho i nā ʻano waiwai a hoʻihoʻi i kahi ʻano lana. ʻAʻole pono ʻoe e hana i nā hoʻololi hou.

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ʻokō o UnityEngine.Random.value

Hoʻihoʻi ka waiwai waiwai o ka papa static UnityEngine.Random i kahi ʻano lana mai kahi pae paʻa o nā waiwai [0; 1). E hoʻolālā iā ia ma luna o kahi ākea i ke ʻano like me ka hoʻokō ʻana i 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ʻokō i ka Unity.Mathematics.Random.NextFloat()

Hoʻihoʻi ke ʻano NextFloat() o ka papa Unity.Mathematics.Random i kahi kiko lana o ke ʻano lana a hiki iā ʻoe ke kuhikuhi i nā ʻano waiwai. ʻO ka nuance wale nō, ʻo kēlā me kēia laʻana o Unity.Mathematics.Random e hoʻomaka ʻia me kekahi hua - ma kēia ala mākou e pale aku ai i ka hana hou ʻana.

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

Hoʻokō o MainController

Ua mākaukau kekahi mau hoʻokō o IRandomGenerator. A laila, pono ʻoe e hoʻopuka i nā kaʻina a mālama i ka ʻikepili hopena no ka hana ʻana. No ka hana ʻana i kēia, e hana mākou i kahi hiʻohiʻona a me kahi palapala MainController liʻiliʻi ma Unity, e hana i nā hana pono āpau a ma ka manawa like ke kuleana no ka launa pū ʻana me ka UI.

E hoʻonohonoho i ka nui o ka ʻikepili a me ka laulā o nā waiwai MF, a e kiʻi pū i kahi ala e hoʻihoʻi ai i kahi ʻano o nā mea hana i hoʻonohonoho ʻia a mākaukau e hana.

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

        ...
    }
}

I kēia manawa e hana mākou i kahi waihona. I kēia hihia, e hui pū ʻia ka hana ʻikepili me ka hoʻopaʻa ʻana i nā hopena i loko o kahi kahawai kikokikona (ma ke ʻano csv). No ka mālama ʻana i nā waiwai o kēlā me kēia IRandomGenerator, ua hoʻokaʻawale ʻia kāna kolamu ʻokoʻa, a aia ka laina mua i ka inoa o ka generator.

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

        ...
    }
}

ʻO nā mea a pau e koe, ʻo ke kāhea ʻana i ke ʻano GenerateCsvDataSet a mālama i ka hopena i kahi faila, a i ʻole e hoʻololi koke i ka ʻikepili ma luna o ka pūnaewele mai ka ʻaoʻao hope a i ke kikowaena loaʻa.

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

        ...
    }
}

Aia nā kumu papahana ma GitLab.

Nā hualoaʻa

ʻAʻohe hana mana. ʻO ka mea a lākou i manaʻo ai, ʻo ia ka mea i loaʻa iā lākou - i nā hihia āpau, ka hāʻawi like ʻana me ka ʻole o nā kipi. ʻAʻole au i ʻike i ke kumu o ka waiho ʻana i nā kiʻi kaʻawale no nā paepae - hōʻike lākou a pau i nā hopena like.

ʻO ka ʻoiaʻiʻo:
BlessRNG a nānā paha i ka RNG no ka pololei

ʻO ka ʻike ʻana i nā kaʻina ma ka mokulele mai nā ʻano hana ʻelima a pau:
BlessRNG a nānā paha i ka RNG no ka pololei

A me ka nānā ʻana ma 3D. E waiho wale wau i ka hopena o System.Random.Next() i ʻole e hoʻopuka i kahi pūʻulu o nā mea like.
BlessRNG a nānā paha i ka RNG no ka pololei

ʻO ka moʻolelo i haʻi ʻia ma ka hoʻomaka ʻana e pili ana i ka puʻunaue maʻamau o UnityEngine.Random ʻaʻole i hana hou iā ia iho: a i ʻole he hewa mua ia, a i ʻole ua loli kekahi mea i ka mīkini. Akā i kēia manawa ua maopopo iā mākou.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka