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:
- 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.
- 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.
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.
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.
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:
ʻ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:
E nānā kākou i ka leo (heluhelu ʻekolu helu i ka manawa hoʻokahi):
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.
- System.Random.Next(). Hoʻopuka i nā helu helu ma kahi ʻano waiwai.
- System.Random.NextDouble(). Hoʻopuka i nā helu kikoʻī pālua ma ka laulā mai [0; 1).
- UnityEngine.Random.Range(). Hoʻopuka i nā helu kikoʻī hoʻokahi (nā lana) ma kahi ʻano waiwai i hāʻawi ʻia.
- UnityEngine.Random.value. Hoʻopuka i nā helu kikoʻī hoʻokahi (nā lana) ma ka laulā mai [0; 1).
- 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:
- Hiki ke hoʻonohonoho i ka laulā o nā waiwai [min / max). E hoʻonoho ʻia ma o ka mea hana.
- 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ā.
- ʻ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
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:
ʻO ka ʻike ʻana i nā kaʻina ma ka mokulele mai nā ʻano hana ʻelima a pau:
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.
ʻ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