BlessRNG vel reprehendo RNG ad iustitiam

BlessRNG vel reprehendo RNG ad iustitiam

In ludo evolutionis, saepe debes aliquid fortuiti ligare: Unitas hoc habet suum Random, et in paralis cum eo est System.Random. Olim, in una incepta, impressionem feci ut utrumque aliter operari posset (quamvis etiam distributio habere debeat).

Tunc in singula non introierunt - satis erat transitus ad System.Random omnes difficultates emendavit. Nunc eam accuratius inspicere decrevimus et parvam inquisitionem ducere: quomodo "biased" seu praedictio RNGs sint, et quae quis eligat. Praeterea plus quam semel audivi de eorum "honestitate" opiniones discrepantes, quomodo reales eventus declaratos comparent, conabimur explanare.

Brevis institutionis progressio vel RNG est actu RNG

Si iam nota sunt numero incerti generantium, tunc statim transilire potes ad sectionem "Temptatis".

Numeri incerti (RN) sunt sequentia numerorum generatorum utentes processus quidam incerti (chaotici) et fons entropiae. Id est, haec consequentia, quorum elementa nullo iure mathematico inter se cohaerent, nullam habent causam et effectum habitudinem.

Quod numerus temere creat, numerus temere generans dicitur (RNG). Videtur quod omnia elementaria sint, sed si a theoria ad praxim moveatur, revera non ita simplex est ad effectum deducendi programmatum algorithmum ad talem seriem generandam.

Ratio est in absentia illius chaos in electronicis hodiernis consumere. Sine ea, numeri temere desinunt esse temere, et genitor eorum in commune munus rationes definitas manifesto vertit. Plures proprietates in IT agro, haec quaestio gravis est (exempli gratia cryptographia), sed aliis solutionem acceptabilem omnino est.

Algorithmum scribere necesse est, qui reditus, licet non vere, numeros temere, sed quam proxime ad illos - numeros quos vocant pseudo-passim (PRN). Algorithmus in hoc casu dicitur numerus generans pseudorandom (PRNG).

Plures optiones creandi PRNG sunt, sed haec ad omnes pertinebit;

  1. Necessitas initialization praevia.

    In PRNG nullum entropy fontem habet, ideo ante usum status initiali tribuendus est. Distinguitur ut numerus (vel vector) et dicitur semen (temere semen). Saepe horologii processus contrarius vel numeralis ratio temporis aequivalens ut semen adhibetur.

  2. Sequentiae reproducibilitas.

    PRNG omnino deterministica est, ideo semen in initializatione determinatum unice determinat totam seriem numerorum futuram. Hoc modo separatum PRNG initialized cum eodem semine (in diversis temporibus, in diversis programmatis, in diversis machinis) eandem sequentiam generabit.

Scire etiam debes probabilitatem distributionis PRNG denotantis, quos numeros generabit et quid probabiliter. Saepissime haec est vel distributio ordinaria vel distributio uniformis.
BlessRNG vel reprehendo RNG ad iustitiam
Normalis distributio (reliquit) et uniformis distributio (right)

Dicamus nos pulchre mori cum 24 lateribus. Si eam iactas, probabilitas unum acquirendi aequale erit 1/24 (eadem ac probabilitas quemlibet alium numerum comparandi). Si multas iactus facis et eventus notas, animadvertes omnes margines cum eadem fere frequentia euenire. Essentialiter haec alea considerari potest RNG cum aequali distributione.

Quid, si statim ieceris horum 10 talorum et puncta summa numerabis? Utrum aequalitas pro eo servetur? Nec. Saepissime moles proxima erit ad 125 puncta, hoc est, ad valorem alicuius mediocris. Quam ob rem, etiam ante iactum, futurum eventum dure aestimare potes.

Ratio est, quia numerus accumsan maximus est ut mediocris score obtineat. Quo remotius, eo pauciores coniunctiones - atque adeo minor probabilitas iacturae est. Si haec data subjicitur, vage figurae campanae similis erit. Ideo, aliquo tractu, systema 10 taxillorum vocari RNG potest cum distributione normali.

Aliud exemplum, hoc modo in plano - ad scopum jaculando. Iaculator erit RNG generans par numerorum (x, y) quae in graph exhibetur.
BlessRNG vel reprehendo RNG ad iustitiam
Esto consentiens optionem sinistram propius esse ad vitam realem - haec est RNG cum distributione normali. Sed si stellas in obscuro caelo dispergere opus est, aptior est recta optio, cum RNG aequabili distributione utens, aptior. In genere, elige genitorem secundum munus adesse.

Nunc de entropy seriei PNG loquamur. Exempli gratia est sequentia quae sic incipit;

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

Quam temere hi numeri primo aspectu sunt? Incipiamus annotando distributionem.
BlessRNG vel reprehendo RNG ad iustitiam
Prope uniforme spectat, sed si ordinem duorum numerorum legas et eas ut coordinatas in plano interpretaris, hoc accipis;
BlessRNG vel reprehendo RNG ad iustitiam
Patet exemplaria manifesta. Et quia notitia sequentia quodammodo ordinatur (id est entropy humilis), hoc ipsum « biam » oriri potest. Ad minimum, talis PRNG non est aptissima ad coordinatas in plano generandas.

Alia sequentia:

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

Omnia denique hic etiam in plano videntur;
BlessRNG vel reprehendo RNG ad iustitiam
Inspiciamus in volumine (lego tres numeros ad tempus);
BlessRNG vel reprehendo RNG ad iustitiam
et iterum exemplaria. Non amplius in quattuor dimensionibus visualizationem construere potest. Sed exempla in hac dimensione et in maioribus existere possunt.

In cryptographia, ubi gravissima necessaria PRNGs imponuntur, talis condicio categorice inconveniens est. Ergo algorithmi speciales effectae sunt ad qualitatem aestimandam, quam nunc non attingemus. Thema est amplum et separatum meretur articulum.

temptationis

Si aliquid certo nescimus, quomodo opus est? Operae pretium est viam transire si nescis quam permittit lumen negotiationis? Consequatur sit varius.

Et sic patet de notoria fortuiti in unitate. Bonum est si documenta necessaria singularia ostendit, sed narratio de qua in principio articuli ob defectum specialium desideratorum evenit.

Et si nescis quomodo ferramentum operatur, eo recte uti non poteris. In genere, tempus venit ut experimentum reprimat et perficiat ut tandem saltem de distributione fac.

Solutio simplex et efficax erat - statistica collectio, notitia obiectiva obtinenda et eventus specta.

Subiectum studii

Plures modi numeri incerti in unitate generandi sunt - quinque probavimus.

  1. System.Random.Next(). Integros generat in data valorum amplitudine.
  2. System.Random.NextDouble(). Duplex praecisio numeros generat in latitudine ab [0; 1).
  3. UnityEngine.Random.Range(). Singulos praecisiones numeros in data valorum latitudine generat.
  4. UnityEngine.Random.value. Generat singulas praecisiones numeros in latitudine ab [0; 1).
  5. Unity.Mathematics.Random.NextFloat(). Pars novae bibliothecae Unity.Mathematics. Singulos praecisiones numeros in data valorum latitudine generat.

Fere ubique in documentis aequabilis distributio definita est, excepta UnityEngine.Random.value (ubi distributio non specificata, sed analogia cum UnityEngine.Random.Range() aequabilis etiam expectabatur) et Unity.Mathematics.Random. .NextFloat() (ubi in Fundamento algorithmus est xorshift, quod significat iterum debes exspectare distributionem uniformem).

Defalta, eventus expectati pro certo in documentis sumti sunt.

ars

Parvam applicationem scripsimus quae series numerorum temere generatorum singulis methodis exhibitis utens et eventus ulterioris processus servavit.

Cuiusque seriei longitudo est 100 numerorum.
Circumspectio numerorum incerti est [0, 100).

Data ex pluribus suggestis target collecta;

  • Fenestra
    - Unitas v2018.3.14f1, Editor modus, Mono, .NET Latin 2.0
  • macos
    - Unitas v2018.3.14f1, Editor modus, Mono, .NET Latin 2.0
    — Unitas v5.6.4p4, Editor modus, Mono, .NET Latin 2.0
  • Android
    - Unitas v2018.3.14f1, fabrica per fabrica, Mono, .NET Latin 2.0
  • iOS
    - Unitas v2018.3.14f1, fabrica per fabrica, il2cpp, .NET Latin 2.0

Реализация

Nos pluribus modis temere numeros generare. Uterque enim scribemus singulas fascias classis, quae providere debent;

  1. Possibilitas ad amplitudinem valorum [min/max). In vitae tincidunt arcu.
  2. Modus reddendi MF. Natat ut genus, quod est generalius, eligamus.
  3. Nomen autem generationis modum consequitur notationem. Pro opportunitate reddemus ut valorem plenum nomen classis + nomen methodi ad MF generandi.

Primum dicamus abstractionem quae per interface IRandomGenerator repraesentabitur;

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

        float Generate();
    }
}

Exsequendam System.Random.Next ()

Haec methodus permittit ut amplitudinem valorum ponas, sed integros redit, sed fluitat opus est. Simpliciter interpretari potes ut fluitantis integer, vel ampliare valores per plures ordines magnitudinis, eas compensans cum singulis generationibus mediterraneis. Ita fiet ut punctum certum cum certo ordine certo. Hac optione utemur cum propius ad valorem realem supernatet.

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

Exsequendam System.Random.NextDouble ()

Hic fixum amplitudo valorum [0; 1). Ut proiciamus in unum certum in conditore, arithmetica simplici utimur: 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;
    }
}

Implementation of UnityEngine.Random.Range ()

Haec methodus UnityEngine.Random genus static tibi permittit ut amplitudinem valorum ponat et genus fluitantis reddat. Non habes mutationes aliqua addita.

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

Implementation of UnityEngine.Random.value

Valor proprietas classis static UnityEngine.Random redit genus fluitantis e certae valorum extensione [0; 1). In partem datam eo modo proiciamus ac cum 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;
    }
}

Exsequendam Unity.Mathematics.Random.NextFloat ()

Proxima methodus unitatis.Mathematics.Random genus recurrit punctum fluitantis generis innatat et te dat ut amplitudinem valorum definias. Sola nuance est quod singulae instantiae unitatis. Mathematics. Random debebit aliquo semine initialized - hoc modo generare sequentia repetenda vitabimus.

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

Exsequendam MainController

Complures exsecutiones IRandomGeneratoris paratae sunt. Deinde, sequentia generare debes et nisi inde dataset ad expediendas. Ad hoc efficiemus scaenam et parvam scripturam MainController in unitate, quae omnia necessaria opera faciet et simul responsabilis commercii cum UI erimus.

Magnitudinem notitiarum MF valorum et amplitudinem constituamus, et methodum quoque obtineamus quae generantium ordinata conformatus et paratus ad laborandum redit.

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

        ...
    }
}

Nunc faciamus dataset. Hoc in casu, generationis notitia coniungetur cum recordatione eventus in textum rivum (in forma csv). Ad valores cuiusque IRandomGeneratoris condo, propria columna separata partita est, et prima linea Nomen generantis continet.

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

        ...
    }
}

Reliquum est, methodum GenerateCsvDataSet vocare et exitum ad limam vocare, vel statim notitias in retiaculum a fine fabrica ad servo recipienti transferre.

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

        ...
    }
}

Ad fontes exertus est GitLab.

Результаты

Nullum miraculum factum est. Id quod speraverunt obtinuerunt - in omnibus, etiam distributio sine coniuratione. Punctum non video in graphis separatis pro suggestu ponendo — omnes fere eosdem eventus ostendunt.

Res ipsa est;
BlessRNG vel reprehendo RNG ad iustitiam

Visualization sequentium in plano ab omnibus modis quinque generationis;
BlessRNG vel reprehendo RNG ad iustitiam

Et visualisation in 3D. Solum exitum System.Random.Next() tantum relinquam ut fasciculum contentorum identicarum non proferam.
BlessRNG vel reprehendo RNG ad iustitiam

Narratur in prooemio de normali distributione UnityEngine.Random se non repetivit: aut initio erroneum est, aut aliquid in machina mutatum est. Sed nunc certi sumus.

Source: www.habr.com

Add a comment