Vraag Hoe genereer ik een willekeurig int-nummer in C #?


Hoe genereer ik een willekeurig geheel getal in C #?


1427
2018-04-24 23:09


oorsprong


antwoorden:


De Random klasse wordt gebruikt om willekeurige getallen te maken. (Pseudo-willekeurige dat is natuurlijk.).

Voorbeeld:

Random rnd = new Random();
int month = rnd.Next(1, 13); // creates a number between 1 and 12
int dice = rnd.Next(1, 7);   // creates a number between 1 and 6
int card = rnd.Next(52);     // creates a number between 0 and 51

Als u meer dan één willekeurig getal wilt maken, moet u het Random instantie en hergebruik. Als u nieuwe instanties te dichtbij in de tijd maakt, produceren ze dezelfde reeks willekeurige getallen als de willekeurige generator wordt gezaaid uit de systeemklok.


1889
2018-04-24 23:19



Telkens wanneer u een nieuwe willekeurige () uitvoert, wordt deze geïnitialiseerd. Dit betekent dat je in een strakke lus verschillende keren dezelfde waarde krijgt. U moet een enkele willekeurige instantie behouden en Next op dezelfde instantie blijven gebruiken.

//Function to get random number
private static readonly Random getrandom = new Random();

public static int GetRandomNumber(int min, int max)
{
    lock(getrandom) // synchronize
    {
        return getrandom.Next(min, max);
    }
}

181
2017-10-04 11:52



De vraag ziet er heel eenvoudig uit, maar het antwoord is wat gecompliceerd. Als je ziet dat bijna iedereen heeft voorgesteld om de willekeurige klasse te gebruiken en sommigen hebben voorgesteld om de cryptoklasse RNG te gebruiken. Maar dan wanneer te kiezen wat.

Daarvoor moeten we eerst de term RANDOMNESS en de filosofie erachter begrijpen.

Ik zou je willen aanmoedigen om deze video te bekijken die dieper ingaat op de filosofie van RANDOMNESS met C # https://www.youtube.com/watch?v=tCYxc-2-3fY 

Laten we eerst de filosofie van RANDOMNESS begrijpen. Wanneer we iemand vertellen om te kiezen tussen ROOD, GROEN en GEEL, wat gebeurt er intern. Wat zorgt ervoor dat iemand ROOD of GEEL of GROEN kiest?

c# Random

Sommige eerste gedachten gaan uit naar de personengeest die zijn keuze bepaalt, het kan favoriete kleur, gelukskleur enzovoorts zijn. Met andere woorden, een eerste trigger die we RANDOM als SEED noemen. Dit SEED is het beginpunt, de trigger die hem ertoe aanzet om de RANDOM-waarde te selecteren.

Als een SEED makkelijk te raden is, wordt dat soort willekeurige getallen aangeduid als PSEUDO en als een zaad moeilijk te raden is, worden die willekeurige getallen aangeduid BEVEILIGD willekeurige nummers.

Als een persoon bijvoorbeeld kiest voor kleur afhankelijk van de combinatie van weer en geluid, dan is het moeilijk om het beginzaad te raden.

c# Random

Laat me nu een belangrijke verklaring afleggen: -

* De klasse "Random" genereert alleen een willekeurig PSEUDO-nummer en om een ​​SECURE willekeurig nummer te genereren, moeten we de klasse "RNGCryptoServiceProvider" gebruiken.

c# Random

Willekeurige klasse neemt seed-waarden van uw CPU-klok die zeer voorspelbaar is. Dus met andere woorden, RANDOM-klasse van C # genereert pseudo-willekeurige getallen, hieronder is de code voor hetzelfde.

Random rnd= new Random();
int rndnumber = rnd.Next()

Terwijl de klasse RNGCryptoServiceProvider OS-entropie gebruikt om zaden te genereren. OS-entropie is een willekeurige waarde die wordt gegenereerd met behulp van geluid, muisklik- en toetsenbordtiming, thermische temp enz. Hieronder wordt de code voor hetzelfde gegeven.

using (RNGCryptoServiceProvider rg = new RNGCryptoServiceProvider()) 
{ 
  byte[] rno = new byte[5];    
  rg.GetBytes(rno);    
  int randomvalue = BitConverter.ToInt32(rno, 0); 
}

Zie deze video voor meer informatie over OS-entropie https://www.youtube.com/watch?v=tCYxc-2-3fY   vanaf 11:20 waar de logica van OS-entropie wordt uitgelegd. Dus in eenvoudige bewoordingen: RNG Crypto genereert beveiligde willekeurige getallen.


151
2018-06-14 06:27



Pas op voor dat new Random() wordt gezaaid op de huidige tijdstempel.

Als je wilt genereren slechts één nummerje kunt gebruiken:

new Random().Next( int.MinValue, int.MaxValue )

Voor meer informatie, kijk naar de Willekeurig klasse, let op:

Omdat de klok echter een eindige resolutie heeft, maakt het gebruik van de parameterloze constructor om opeenvolgende willekeurige objecten te maken, willekeurige generatoren aan die identieke reeksen van willekeurige getallen produceren.

Gebruik deze code dus niet om een ​​reeks van willekeurige nummers te genereren.


72
2018-04-24 23:10



Random r = new Random();
int n = r.Next();

42
2018-04-24 23:10



Ik wilde een cryptografisch beveiligde versie toevoegen:

RNGCryptoServiceProvider Class (MSDN of dotnetperls)

Het implementeert IDisposable.

using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
   byte[] randomNumber = new byte[4];//4 for int32
   rng.GetBytes(randomNumber);
   int value = BitConverter.ToInt32(randomNumber, 0);
}

22
2017-12-18 21:02



het is beter om het willekeurige object in te zaaien met de huidige milliseconden, om echt willekeurig nummer te garanderen, en je zult bijna geen duplicaten vinden die er vele keren gebruik van maken

Random rand = new Random(DateTime.Now.Millisecond);

13
2017-11-01 12:30