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:
- 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.
- 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.
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.
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.
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:
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:
Sei o tatou tilotilo i le voluma (faitau numera e tolu i le taimi):
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.
- System.Random.Next(). E fa'atupuina fa'atasi i se vaega o tau.
- System.Random.NextDouble(). Fa'atupu numera sa'o fa'alua i le va'aiga mai le [0; 1).
- UnityEngine.Random.Range(). Fa'atupuina numera sa'o tasi (fa'aola) i se fa'avasegaga o tau.
- UnityEngine.Random.value. Fa'atupu numera sa'o tasi (opeopea) i le va'aiga mai le [0; 1).
- 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:
- Avanoa e seti le tele o tau [min / max). O le a setiina e ala i le faufale.
- Metotia toe faafoi MF. Se'i o tatou filifili o le fa'apeopea e pei o le ituaiga, aua e sili atu ona lautele.
- 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
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:
Va'aiga o fa'asologa i luga o se va'alele mai metotia uma o augatupulaga e lima:
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.
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