Vra

Ek wil graag 'n ewekansige swaai punt getal tussen 2 waardes genereer. Wat is die beste manier om dit te doen in C #?

Was dit nuttig?

Oplossing

Die enigste ding wat ek wil byvoeg Eric reaksie se is 'n verduideliking; Ek voel dat kennis van hoekom kode werk is beter as om te weet wat kode werk.

Die verduideliking is dit: kom ons sê jy wil 'n getal tussen 2.5 en 4.5. Die reeks is 2,0 (4,5-2,5). NextDouble terugkeer net 'n getal tussen 0 en 1,0, maar as jy dit vermenigvuldig met die reeks wat jy sal 'n nommer te kry tussen 0 en reeks .

So, sou dit ons gee ewekansige dubbelspel tussen 0.0 en 2.0:

rng.NextDouble() * 2.0

Maar, wil ons hulle tussen 2,5 en 4,5! Hoe kan ons dit doen? Voeg die kleinste getal, 2.5:

2.5 + rng.NextDouble() * 2.0

Nou, kry ons 'n getal tussen 0.0 en 2.0; as jy 2.5 voeg by elk van hierdie waardes ons sien dat die reeks is nou tussen 2.5 en 4.5.

Aanvanklik het ek gedink dat dit saak maak as b> 'n of 'n> b, maar as jy dit uitwerk beide maniere wat jy sal vind dit werk uit identies so lank as wat jy doen nie gemors aan die orde van die veranderlikes gebruik . Ek hou daarvan om dit uit te druk met meer veranderlike name sodat ek nie ontslae deurmekaar:

double NextDouble(Random rng, double min, double max)
{
    return min + (rng.NextDouble() * (max - min));
}

Ander wenke

System.Random r = new System.Random();

double rnd( double a, double b )
{
   return a + r.NextDouble()*(b-a);
}
// generate a random number starting with 5 and less than 15
Random r = new Random();
int num = r.Next(5, 15);  

Vir dubbelspel jy kan vervang Volgende met NextDouble

Hier is 'n uittreksel van hoe om Cryographically veilig ewekansige getalle te kry: Dit sal in die 8 grepe met 'n crytographically sterk volgorde van ewekansige waardes vul.

byte[] salt = new byte[8];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(salt);

Vir meer besonderhede sien Hoe Random is jou Random ?? " (geïnspireer deur 'n CodingHorror artikel op die dek geskuifel)

Hoe ewekansige? As jy nie kan hanteer pseudo-ewekansige dan eenvoudig:

Random randNum = new Random();
randNum. NextDouble(Min, Max);

As jy wil 'n "beter" random nommer, dan het jy waarskynlik moet kyk na die Mersenne Twister algoritme. Baie van die mense hav reeds geïmplementeer dit vir jou al

Vir 'n verduidlikings van waarom Longhorn het soveel is downmodded: http: / /msdn.microsoft.com/en-us/magazine/cc163367.aspx Kyk uit vir die implementering van NextDouble en die verduideliking van wat is 'n ewekansige dubbel.

Dit skakel ook 'n goo voorbeeld van hoe om kriptografiese ewekansige getalle te gebruik (soos Sameer genoem) slegs met werklike nuttige uitgange in plaas van 'n bietjie stroom.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top