Tabel met willekeurige getallen uit 1. Generator voor willekeurige getallen

Bij het ontwikkelen van programma's is er vaak behoefte aan consistentie willekeurige nummers. In games kan een reeks willekeurige getallen in verschillende situaties worden gebruikt: het creëren van monsters, het genereren van territorium, het gedrag van kunstmatige intelligentie.

Er zijn veel dingen mogelijk zonder een willekeurige nummergenerator. Een dergelijke reeks getallen kan bijvoorbeeld niet als willekeurig worden beschouwd: (0, 1, 2, 3, 4, 5, 6, 7). Hier, als je het vorige nummer kent, is het heel gemakkelijk om het volgende te raden. Er zijn andere reeksen. Bijvoorbeeld: (0, 1, 3, 2, 6, 7, 5, 4). Hier is het raden van het volgende getal veel moeilijker. Dergelijke reeksen zijn soms handig om in programma's te gebruiken. Deze volgorde wordt bepaald door de Gray-code. Bij eerste inspectie lijkt het erop dat hier willekeurige getallen worden weergegeven.

In plaats van reeksen getallen te gebruiken in programma's die aan bepaalde wetten voldoen, is het in veel gevallen beter om willekeurig gegenereerde getallen te gebruiken.

Het genereren van pseudo-willekeurige getallen

Het genereren van pseudo-willekeurige getallen wordt vaak gebruikt. Die. De cijfers zijn niet geheel willekeurig. We hebben al naar de functie rand() gekeken. Als je een programma schrijft dat deze functie, dan zal rand() elke keer dat het programma wordt uitgevoerd, dezelfde reeks getallen genereren. De door rand() gegenereerde reeks wordt bepaald door het zaad. Eerst wordt het initiële getal gespecificeerd en vervolgens worden met behulp van een bepaalde formule alle andere getallen in de reeks berekend. Als u het startgetal kent en de formule waarmee de getallen worden berekend, kunt u het volgende getal berekenen.

Dergelijke algoritmen worden deterministisch (vooraf bepaald) genoemd. Die. daarin wordt een reeks getallen gemaakt op basis van initiële gegevens. In dit geval is de reeks getallen pseudo-willekeurig: d.w.z. Als u het startnummer kent, kunt u alle volgende achterhalen. Maar het is onwaarschijnlijk dat de gebruiker ze herkent; de cijfers lijken willekeurig.

Een van de vooraf gedefinieerde (deterministische) algoritmen voor het genereren van willekeurige getallen is lineair congruent.

Het instellen van de beginwaarde (voor de functie rand() die we tot nu toe hebben gebruikt) ziet er ongeveer zo uit:

code in c++-taal int ik; cin >> ik; srnd(i); // instellen van de initiële waarde rand();

De srnd-functie stelt de initiële waarde van i in.

Lineaire congruentiële methode voor het genereren van willekeurige getallen

Er zijn veel methoden om willekeurige getallen te genereren. Lineair congruent is er slechts één van. De methode is vrij oud - jaren vijftig. Het is ontworpen door Derrick Lemaire.

Om het algoritme te implementeren, moet u vier parameters instellen:

Waardenbereik m, met m > 0.
Vermenigvuldiger a (0<= a <= m).
Oplopende waarde c (0<= c <= m).
Initiële waarde X0 (0<= X0 < m).

Nadat u deze parameters hebt bepaald, kunt u de formule gebruiken:

Xi+1 = (aXi + c) % m (waarbij i groter is dan of gelijk is aan 0)

i is het nummer van het element in de reeks.
m - het aantal waarden waaruit de reeks is gevormd.
Laat me je eraan herinneren dat % de rest van de deling is.

Laten we eens kijken naar een voorbeeld van een kleine reeks. Neem een ​​stuk papier en een potlood en bereken alle waarden:

imax = 5; // vormen een reeks van 5 elementen
m = 10; // waarden in het reeksbereik van nul tot 9
een = 2;
c = 3;
X0 = 6; // initiële waarde (zaad)

Xi+1 = (2*Xi + 3) % 10 (waarbij i groter is dan of gelijk is aan 0)

X1 = 15% 10 = 5
X2 = 13% 10 = 3
X3 = 9% 10 = 9
X4 = 21% 10 = 1
X5 = 5% 10 = 5

Als we de reeks verhogen, beginnen de waarden zich te herhalen. Verschillende niet-herhalende waarden in een reeks vormen dus een punt. De periode in dit voorbeeld is ( 5, 3, 9, 1 ).

Met behulp van de lineaire congruente methode hebben we dus een reeks willekeurige getallen van vijf elementen verkregen.

Om de waarden van elementen in een reeks te voorspellen, kunt u de formule gebruiken:

Xi+k = (a*k*Xi + (a*k-1)*c/b) % m (waarbij k en i groter zijn dan of gelijk zijn aan 0)

Hier b = a - 1. Bovendien geldt a >= 2, b >= 1.

Laten we het zesde element berekenen met behulp van deze formule (we kennen het vijfde al):

X5+1 = (a*1*X5 + (a*1-1)*c/b) % m = (2*1*5 + (2*1-1)*3/1) % 10 = 13 % 10 = 3

Alles groeit, toch?

Een reeks gemaakt met behulp van de lineaire congruente methode en gedefinieerd door gehele parameters m, a, c en X0 heeft een periode gelijk aan het getal m wanneer aan de volgende voorwaarden wordt voldaan:
1. De grootste gemene deler van c en m is 1.
2.b is een veelvoud van elk priemgetal dat een deler is van m.
3. Als m een ​​veelvoud van 4 is, dan is b ook een veelvoud van 4.

Keuze m

De periode kan niet groter zijn dan het getal m. Daarom moet m behoorlijk groot zijn.

Het zou het beste zijn als m gelijk zou zijn aan het maximale element in de reeks imax+1 (we voegen er één toe, aangezien i vanaf nul wordt geteld). Een andere populaire keuze is de kracht van twee 2n. Op voorwaarde dat n de lengte van het machinewoord in bits is, kan de restbewerking worden geëlimineerd. Als m een ​​macht van twee is, kan de restbewerking worden vervangen door de snellere bitsgewijze AND-bewerking (hoewel dit niet relevant is voor moderne computers):

x % 2n == x & (2n - 1)
Voorbeelden (x is een geheel getal):

x % 2 == x & 1;
x % 4 == x & 3;
x % 8 == x & 7;
Heel vaak wordt voor m één van de Mersenne-priemgetallen gekozen. Vaak wordt het getal 231 - 1 gebruikt wanneer berekeningen worden uitgevoerd met 32-bits gegevens.

Vermenigvuldiger a

De vermenigvuldiger moet zo worden gekozen dat de periode zo lang mogelijk is. Er is een ernstig probleem met deze coëfficiënt: voor kleine waarden van a geldt dat als het huidige element van de reeks klein genoeg is, het volgende element waarschijnlijk ook klein zal zijn.

Verhogen c

Deze parameter kan vrij willekeurig worden gekozen. Heel vaak wordt deze op nul gezet, maar dit verkort de lengte van de periode en X0 != 0.

Initiële waarde (zaad)

We kwamen er dus achter dat er een punt in de reeks zit. In ons voorbeeld is de periode gelijk aan slechts vier elementen. In andere gevallen kan de periode erg lang zijn, maar hij is er altijd! Dat wil zeggen, als we bij het genereren van willekeurige getallen met behulp van de lineaire congruente methode een zeer grote reeks nodig hebben, dan zullen de waarden daarin met een bepaalde periodiciteit worden herhaald.

Gewoon zo! Het genereren van opeenvolgende nummers is een echte hoax!

Die. Laten we zeggen dat we een generator voor willekeurige getallen hebben. Wij gebruiken het voor verschillende programma's. Altijd, altijd creëert deze generator dezelfde reeks getallen (met dezelfde beginwaarden). We kunnen alleen de beginwaarde instellen.

Over het algemeen is het met rekenkundige methoden onmogelijk om een ​​werkelijk willekeurige reeks getallen te construeren. Hoe treurig grapte onze vriend John Von Neumann:

"Iedereen die rekenkundige methoden gebruikt om willekeurige getallen te produceren, verkeert in een staat van zonde." (C) John Von Neumann.

Het is allemaal triest. Dit is hoe je leeft en leeft. Omdat je in een staat van onwetendheid verkeert, denk je: “Maar het zou cool zijn om een ​​generator voor willekeurige getallen te creëren, gebaseerd op de lineaire cognitieve methode!” Maar het blijkt dat op deze manier geen echt willekeurige reeks kan worden gecreëerd. Ineenstorting van de hoop! Depressie en nu sta je al op de drempel van de eerste fase van alcoholisme. Deze last van het onvermogen om je verlangens te verwezenlijken zal de rest van je leven op je blijven drukken... Ik raakte afgeleid. Laten we doorgaan.

Implementatie van het genereren van willekeurige getallen

Nu we de theoretische kwesties met betrekking tot generatoren van willekeurige getallen hebben bekeken, gaan we eens kijken naar de implementatie, vooral omdat deze vrij eenvoudig is.

Voor de hierboven besproken reeks ziet de generator er als volgt uit:

code in C++-taal int rnd() ( int m = 10, a = 2, c = 3; statische int x = x0; // x wordt gedeclareerd als een statische variabele x = ((a * x) + c) % m; // formule x0 = x; retour x )

X0 wordt gedeclareerd als een globale variabele:

int x0 = 6;

Dit is de meest primitieve versie van de generator. In werkelijkheid kan zo'n monster niet worden gebruikt! Maar wij gaan het doen!

Bij deze implementatie houden we op geen enkele manier toezicht op de mogelijkheid van variabele overflow. Gebruik in plaats van het int-type het _int64-type - dit is een integer-type van acht bytes.

priemgetallen

Priemgetallen zijn getallen die zonder rest alleen door één en het getal zelf kunnen worden gedeeld. Bijvoorbeeld: 11, 3, 7.

Grijze code

Grijze code is een reeks cijfers waarbij het volgende nummer één bit verschilt van het vorige. Die. om de reeks te raden, moet je niet naar de decimale getallen kijken, maar naar hun binaire equivalenten.

Hier is een oplopende reeks getallen van 0 tot 7 in binaire code:

000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7
Met behulp van de code van Gray krijgen we de volgende reeks:

000 0
001 1
011 3
010 2
110 6
111 7
101 5
100 4
Mersenne-priemgetallen

Op dit moment is het 44e Mersennegetal bekend. Uit de naam blijkt duidelijk dat deze getallen priemgetallen zijn, d.w.z. zijn alleen deelbaar door één en zichzelf. Bovendien moeten deze getallen aan de volgende formule voldoen:

Waarbij n ook een priemgetal is. Voor de eerste negen Mersenne-priemgetallen zijn de n: (2, 3, 5, 7, 13, 17, 19, 31, 61).

Bitsgewijze logische bewerkingen

We hebben al gekeken naar de logische operatoren && (AND) en || (OF). Er zijn ook bitsgewijze logische operatoren & (bitsgewijze AND) en | (bitsgewijs OF). Werk de bewerking als volgt uit:

5 && 3; // && retourneert altijd nul of één (hier 1)
5&3; // & retourneert een getal

101
011
=
001 // resultaat is één
Dat wil zeggen dat bij deze bewerking de overeenkomstige posities van twee getallen worden vergeleken en als ze gelijk zijn, wordt 1 in het resulterende getal op deze positie geschreven, anders nul.
5 | 3; // | geeft een getal terug

101
011
=
111 // resulterend in 7

Graad van

Om een ​​getal tot een macht te verheffen, kun je de functie pow(x,y) gebruiken. In dit geval ontvangt u xy. De functie is overbelast, waardoor deze met verschillende typen kan worden gebruikt. Om de functie pow() te gebruiken, moet u het headerbestand math.h opnemen.
Andere generatoren voor willekeurige getallen

Naast de lineaire congruente generator zijn er nog vele andere. Bijvoorbeeld de Mersenne Vortex, uitgevonden door twee Japanse wetenschappers (ik herinner me hun namen niet) in 1997. Het heeft een zeer lange (heel lange, op zijn zachtst gezegd) periode. Trouwens, de Mersenne-vortex gebruikt een lineaire congruente generator om het zaad te plaatsen.

Bij het versleutelen worden willekeurige nummergeneratoren gebruikt. Maar hier worden speciale generatoren gebruikt: cryptografisch beveiligde pseudo-willekeurige getalgeneratoren. Bijvoorbeeld een blokcijfer, een stroomcijfer, dat is ontwikkeld op basis van het Vernam-cijfer.

Opdrachten:

Implementeer willekeurige nummergeneratoren op basis van de lineaire cogruente methode. Gebruik de volgende parameters:

m = 232; a = 1664525; c = 1013904223. Deze parameters werden gebruikt in het generatorimplementatievoorbeeld in een oud Fortran-boek.
m = 232; a= 214013; c = 2531011; Deze parameters worden gebruikt bij de implementatie van de methode in Visual C++. In dit geval worden de meest significante bits 30..16 genomen. Het zijn de bovenste delen die worden genomen, omdat bij de lineaire congruente methode zijn de lagere bits veel minder willekeurig. Omdat we nog niet weten hoe we specifieke bits moeten nemen, kun je het hele nummer gebruiken.
Kies voor m een ​​van de Mersenne-getallen. Begin klein (23-1.25-1). Probeer 231-1 en 261-1 te vervangen.

De gepresenteerde online generator voor willekeurige getallen werkt op basis van een pseudo-willekeurige getallengenerator met een uniforme verdeling ingebouwd in JavaScript. Er worden gehele getallen gegenereerd. Standaard worden er 10 willekeurige getallen uitgevoerd in het bereik 100...999, waarbij de getallen gescheiden worden door spaties.

Basisinstellingen van de toevalsgenerator:

  • Aantal cijfers
  • Nummerbereik
  • Type scheidingsteken
  • Schakel de functie voor het verwijderen van herhalingen (duplicaten van getallen) in/uit

Het totale aantal is formeel beperkt tot 1000, met een maximum van 1 miljard. Opties voor scheidingstekens: spatie, komma, puntkomma.

Nu weet u precies waar en hoe u een gratis reeks willekeurige getallen in een bepaald bereik op internet kunt krijgen.

Toepassingsmogelijkheden voor een willekeurige nummergenerator

Een willekeurige nummergenerator (RNG in JS met uniforme distributie) zal nuttig zijn voor SMM-specialisten en eigenaren van groepen en communities op de sociale netwerken Instagram, Facebook, VKontakte, Odnoklassniki om de winnaars van loterijen, wedstrijden en prijstrekkingen te bepalen.

Met een generator voor willekeurige getallen kunt u prijzen trekken onder een willekeurig aantal deelnemers met een bepaald aantal winnaars. Wedstrijden kunnen worden gehouden zonder reposts en reacties - u bepaalt zelf het aantal deelnemers en het interval voor het genereren van willekeurige getallen. U kunt op deze site gratis een reeks willekeurige getallen online krijgen en u hoeft geen enkele applicatie op uw smartphone of programma op uw computer te installeren.

Er kan ook een online generator voor willekeurige getallen worden gebruikt om het gooien van een munt of dobbelsteen te simuleren. Voor deze gevallen hebben wij echter aparte gespecialiseerde diensten.

We hebben een reeks getallen die bestaat uit vrijwel onafhankelijke elementen die aan een bepaalde verdeling gehoorzamen. In de regel uniforme distributie.

U kunt op verschillende manieren en manieren willekeurige getallen genereren in Excel. Laten we alleen de beste van hen overwegen.

Willekeurige getalfunctie in Excel

  1. De functie RAND retourneert een willekeurig, uniform verdeeld reëel getal. Het zal kleiner zijn dan 1, groter dan of gelijk aan 0.
  2. De functie RANDBETWEEN retourneert een willekeurig geheel getal.

Laten we het gebruik ervan bekijken met voorbeelden.

Willekeurige getallen bemonsteren met RAND

Deze functie vereist geen argumenten (RAND()).

Om bijvoorbeeld een willekeurig reëel getal in het bereik van 1 tot 5 te genereren, gebruikt u de volgende formule: =RAND()*(5-1)+1.

Het geretourneerde willekeurige getal wordt gelijkmatig over het interval verdeeld.

Telkens wanneer het werkblad wordt berekend of de waarde in een cel in het werkblad verandert, wordt een nieuw willekeurig getal geretourneerd. Als u de gegenereerde populatie wilt opslaan, kunt u de formule vervangen door de waarde ervan.

  1. Klik op de cel met een willekeurig getal.
  2. Selecteer de formule in de formulebalk.
  3. Druk op F9. EN VOER IN.

Laten we de uniformiteit van de verdeling van willekeurige getallen uit de eerste steekproef controleren met behulp van een verdelingshistogram.


Het bereik van verticale waarden is frequentie. Horizontaal - "zakken".



RANDBUSSEN-functie

De syntaxis voor de functie RANDBETWEEN is (ondergrens; bovengrens). Het eerste argument moet kleiner zijn dan het tweede. Anders genereert de functie een fout. Er wordt aangenomen dat de grenzen gehele getallen zijn. De formule negeert het fractionele deel.

Voorbeeld van het gebruik van de functie:

Willekeurige getallen met precisie 0,1 en 0,01:

Hoe maak je een generator voor willekeurige getallen in Excel?

Laten we een generator voor willekeurige getallen maken die een waarde uit een bepaald bereik genereert. We gebruiken een formule zoals: =INDEX(A1:A10,INTEGER(RAND()*10)+1).

Laten we een generator voor willekeurige getallen maken in het bereik van 0 tot 100, in stappen van 10.

U moet twee willekeurige selecteren uit de lijst met tekstwaarden. Met behulp van de RAND-functie vergelijken we tekstwaarden in het bereik A1:A7 met willekeurige getallen.

Laten we de INDEX-functie gebruiken om twee willekeurige tekstwaarden uit de originele lijst te selecteren.

Om één willekeurige waarde uit de lijst te selecteren, gebruikt u de volgende formule: =INDEX(A1:A7,RANDBETWEEN(1,COUNT(A1:A7))).

Willekeurige nummergenerator met normale verdeling

De functies RAND en RANDBETWEEN produceren willekeurige getallen met een uniforme verdeling. Elke waarde met dezelfde waarschijnlijkheid kan zowel binnen de ondergrens van het gevraagde bereik als binnen de bovengrens vallen. Dit resulteert in een enorme spreiding ten opzichte van de streefwaarde.

Een normale verdeling houdt in dat de meeste gegenereerde getallen dicht bij het doelgetal liggen. Laten we de RANDBETWEEN-formule aanpassen en een gegevensarray maken met een normale verdeling.

De kosten van product X bedragen 100 roebel. De gehele geproduceerde batch volgt een normale verdeling. Een willekeurige variabele volgt ook een normale kansverdeling.

Onder dergelijke omstandigheden is de gemiddelde waarde van het bereik 100 roebel. Laten we een array genereren en een grafiek bouwen met een normale verdeling met een standaardafwijking van 1,5 roebel.

We gebruiken de functie: =NORMINV(RAND();100;1.5).

Excel berekende welke waarden binnen het waarschijnlijkheidsbereik lagen. Omdat de kans op het produceren van een product met een kostprijs van 100 roebel maximaal is, toont de formule vaker waarden in de buurt van 100 dan andere.

Laten we verder gaan met het plotten van de grafiek. Eerst moet u een tabel met categorieën maken. Om dit te doen, verdelen we de array in perioden:

Op basis van de verkregen gegevens kunnen we een diagram maken met een normale verdeling. De waarde-as is het aantal variabelen in het interval, de categorie-as is het aantal perioden.

Help de service met één klik: Vertel je vrienden over de generator!

Online nummergenerator in 1 klik

De willekeurige nummergenerator, die op onze website wordt gepresenteerd, is erg handig. Het kan bijvoorbeeld worden gebruikt bij sweepstakes en loterijen om de winnaar te bepalen. De winnaars worden op deze manier bepaald: het programma produceert een of meer getallen in elk door u aangegeven bereik. Frauduleuze resultaten kunnen onmiddellijk worden uitgesloten. En dankzij dit wordt de winnaar bepaald door een eerlijke keuze.

Soms is het nodig om in één keer een bepaald aantal willekeurige getallen te verkrijgen. U wilt bijvoorbeeld een loterijticket "4 uit 35" invullen, vertrouwend op het toeval. U kunt het volgende controleren: als u 32 keer een munt opgooit, wat is dan de kans dat er 10 tegenslagen achter elkaar verschijnen (kop/munt kan heel goed de cijfers 0 en 1 krijgen)?

Willekeurig nummer online video-instructie - randomizer

Onze nummergenerator is zeer eenvoudig te gebruiken. U hoeft geen programma naar uw computer te downloaden; u kunt het online gebruiken. Om het gewenste getal te krijgen, moet u het bereik van willekeurige getallen, het aantal en, indien gewenst, het scheidingsteken voor getallen instellen en herhalingen elimineren.

Om willekeurige getallen in een specifiek frequentiebereik te genereren:

  • Selecteer een bereik;
  • Geef het aantal willekeurige getallen op;
  • De functie “Nummerscheidingsteken” dient voor de schoonheid en het gemak van hun weergave;
  • Schakel indien nodig herhalingen in/uit met behulp van het selectievakje;
  • Klik op de knop "Genereren".

Als gevolg hiervan ontvangt u willekeurige getallen in een bepaald bereik. Het resultaat van de nummergenerator kan worden gekopieerd of per e-mail worden verzonden. Het beste is om een ​​screenshot of video te maken van dit generatieproces. Onze randomizer zal al uw problemen oplossen!