Kaip sukurti atsitiktinį skaičių C #?

Kaip generuoti atsitiktinį sveikąjį skaičių C #?

1540 m
25 апр. Rella nustatė balandžio 25 d 2010-04-25 02:09 '10, 02:09 2010-04-25 02:09
@ 29 atsakymai

Random “ klasė naudojama atsitiktiniams skaičiams kurti. (Pseudo-atsitiktinis, žinoma.)

Pavyzdys:

2038 m
25 апр. Guffa atsakymas 2010-04-25 02:19 '10, 2:19, 2010-04-25 02:19

Kiekvieną kartą atlikus naują atsitiktinį (), jis inicijuojamas. Tai reiškia, kad įtemptoje linijoje daug kartų gaunate tą pačią vertę. Turite išsaugoti vieną atsitiktinio įvykio egzempliorių ir tęsti tą patį pavyzdį.

border=0
 //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); } } 
197
04 окт. atsakymą pateikė Pankaj Mishra 04 okt. 2010-10-04 14:52 '10, 14:52 PM 2010-10-04 14:52

Klausimas atrodo labai paprastas, tačiau atsakymas yra šiek tiek sudėtingas. Jei matote, beveik visi pasiūlė naudoti atsitiktinę klasę, o kai kurie pasiūlė naudoti RNG kriptografinę klasę. Bet tada, kada pasirinkti, kas.

Norėdami tai padaryti, pirmiausia turime suprasti terminą „Nelaimingas atsitikimas ir jo filosofija“.

Aš patarčiau žiūrėti šį vaizdo įrašą, kuris giliau įsitraukia į atsitiktinumo filosofiją, naudodamas C # https://www.youtube.com/watch?v=tCYxc-2-3fY

Visų pirma, suprasime RANDOMNESS filosofiją. Kai mes sakome asmeniui pasirinkti RED, GREEN ir YELLOW, kas vyksta viduje. Ką žmogus pasirenka RED, YELLOW arba GREEN?

2019

Saugokitės, kad new Random() pridėtas prie dabartinio laiko žymos.

Jei norite sukurti tik vieną numerį, galite naudoti:

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

Daugiau informacijos ieškokite atsitiktinės klasės, tačiau atkreipkite dėmesį:

Tačiau, kadangi laikrodis turi baigtinę skiriamąją gebą, naudojant parametrinį konstruktorių, skirtą atsitiktiniams objektams kurti, sekoje sukuriama atsitiktinių skaičių generatorių, kurie sukuria vienodas atsitiktinių skaičių sekas.

Todėl nenaudokite šio kodo atsitiktinių skaičių serijos generavimui.

76
25 апр. atsakymą pateikė Fyodor Soikin balandžio 25 d. 2010-04-25 02:10 '10, 2:10, 2010-04-25 02:10
 Random r = new Random(); int n = r.Next(); 
43
25 апр. Joreno atsakymas, pateiktas balandžio 25 d 2010-04-25 02:10 '10, 2:10, 2010-04-25 02:10

Norėjau pridėti kriptografiškai saugią versiją:

RNGCryptoServiceProvider ( MSDN arba dotnetperls ) klasė

Jis įgyvendina IDisposable.

 using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider()) { byte[] randomNumber = new byte[4];//4 for int32 rng.GetBytes(randomNumber); int value = BitConverter.ToInt32(randomNumber, 0); } 
22
19 дек. Atsakymas pateikiamas joordan831 gruodžio 19 d. 2015-12-19 00:02 '15 - 0:02 2015-12-19 00:02

Jūs galite naudoti Jon Skeet StaticRandom metodą MiscUtil klasės bibliotekoje, kurią jis sukūrė pseudo-atsitiktiniam skaičiui.

 using System; using MiscUtil; class Program { static void Main(string[] args) { for (int i = 0; i < 100; i++) { Console.WriteLine(StaticRandom.Next()); } } } 
13
25 апр. atsakymas pateikiamas mbcrump 25 balandžio. 2010-04-25 02:31 '10, 2:31 val. 2010-04-25 02:31

geriau užpildyti atsitiktinį objektą su dabartinėmis milisekundėmis, kad gautumėte tikrą atsitiktinį skaičių, ir jūs beveik nerasite dublikatų, naudodami jį daug kartų

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

Atnaujinti

Žinau, kad new Random() naudoja dabartinę sritį kaip sėklą, tačiau darbas su dabartinėmis milisekundėmis vis dar yra gana geras, nes tai yra geras atsitiktinis paleidimas.

Paskutinis dalykas, kad jums nereikia inicijuoti new Random() kiekvieną kartą, kai jums reikia atsitiktinio skaičiaus, inicijuoti vieną atsitiktinį objektą, tada naudokite jį tiek kartų, kiek jums reikia viduje kilpa ar kažkas kita.

11
01 нояб. Atsakymą pateikė Mohamed Selim 01 lapkritis. 2015-11-01 15:30 '15 15:30 2015-11-01 15:30

Bandžiau visus šiuos sprendimus, išskyrus COBOL atsakymą ... lol

Nė vienas iš šių sprendimų nebuvo pakankamai geras. Man reikia atsitiktinių spartų int kilpai, ir aš gaunu tonų pasikartojančių reikšmių netgi labai plačiai. Po ilgų atsitiktinių rezultatų atsiskaitymo nusprendžiau galutinai išspręsti šią problemą.

Viskas apie sėklas.

Sukuriu atsitiktinį sveikąjį skaičių, analizuodamas ne skaitinius duomenis iš „Guid“, tada naudoju jį kuriant „Random“ klasės egzempliorių.

 public int GenerateRandom(int min, int max) { var seed = Convert.ToInt32(Regex.Match(Guid.NewGuid().ToString(), @"\d+").Value); return new Random(seed).Next(min, max); } 

Atnaujinimas : raminti nereikia, jei vieną kartą sukuriate atsitiktinės klasės egzempliorių. Todėl būtų geriau sukurti statinę klasę ir paskambinti šiuo metodu.

 public static class IntUtil { private static Random random; private static void Init() { if (random == null) random = new Random(); } public static int Random(int min, int max) { Init(); return random.Next(min, max); } } 

Tada galite naudoti statinę klasę, kaip tai padaryti.

 for(var i = 0; i < 1000; i++) { int randomNumber = IntUtil.Random(1,100); Console.WriteLine(randomNumber); } 

Pripažįstu, kad man patinka šis požiūris geriau.

9
20 мая '15 в 0:19 2015-05-20 00:19 atsakymą pateikė „ Proximo“ gegužės 15 d., 15 val. 0:19 2015-05-20 00:19

Skaičiai, kuriuos generuoja įmontuota klasė Random (System.Random), generuoja pseudo-atsitiktinius skaičius.

Jei jums reikalingi tikri atsitiktiniai skaičiai, artimiausias dalykas, kurį galime gauti, yra „saugus pseudo-atsitiktinis generatorius“, kuris gali būti generuojamas naudojant kriptografines klases C #, pvz., RNGCryptoServiceProvider .

Tačiau, jei vis tiek reikia tikri atsitiktiniai skaičiai, jums reikės naudoti išorinį šaltinį, pvz., Radioaktyvaus skilimo prietaisus, kaip sėklą atsitiktinių skaičių generatoriui. Kadangi pagal apibrėžimą bet koks grynai algoritminiais būdais sukurtas skaičius negali būti tikrai atsitiktinis.

6
22 июля '15 в 18:40 2015-07-22 18:40 atsakymą pateikė Anshita Arya liepos 15 d. 15:40 2015-07-22 18:40

Naudoju žemiau pateiktą kodą atsitiktiniam skaičiui:

 var random = new Random((int)DateTime.Now.Ticks); var randomValue = random.Next(startValue, endValue + 1); 
6
14 окт. atsakymas pateikiamas 14 val. 2015-10-14 17:38 '15, 17:38 PM 2015-10-14 17:38

Tai yra klasė, kurią naudoju. Veikia kaip RandomNumber.GenerateRandom(1, 666)

 internal static class RandomNumber { private static Random r = new Random(); private static object l = new object(); private static Random globalRandom = new Random(); [ThreadStatic] private static Random localRandom; public static int GenerateNewRandom(int min, int max) { return new Random().Next(min, max); } public static int GenerateLockedRandom(int min, int max) { int result; lock (RandomNumber.l) { result = RandomNumber.r.Next(min, max); } return result; } public static int GenerateRandom(int min, int max) { Random random = RandomNumber.localRandom; if (random == null) { int seed; lock (RandomNumber.globalRandom) { seed = RandomNumber.globalRandom.Next(); } random = (RandomNumber.localRandom = new Random(seed)); } return random.Next(min, max); } } 
4
07 дек. Atsakymas pateikiamas „ AskethZ 07“. 2014-12-07 11:15 '14 at 11:15 2014-12-07 11:15
 Random random = new Random (); int randomNumber = random.Next (lowerBound,upperBound); 
4
17 марта '17 в 5:59 2017-03-17 05:59 Atsakymas pateikiamas „ ReRoute“ kovo 17 d., 17 val. 5:59 2017-03-17 05:59

Nors viskas tvarkinga:

 Random random = new Random(); int randomNumber = random.Next() 

Jūs norite valdyti ribą (min ir max mumbers) didžiąją laiko dalį. Todėl reikia nurodyti, kur prasideda ir baigiasi atsitiktinis skaičius.

Next() metodas turi du parametrus: min ir max.

Taigi, jei noriu, kad mano atsitiktinis skaičius būtų nuo 5 iki 15, aš tiesiog padariau

 int randomNumber = random.Next(5, 16) 
3
22 авг. Atsakymas duotas ojonugwa ochalifu 22 rug . 2014-08-22 13:24 „14, 13:24 pm 2014-08-22 13:24

Pakeistas atsakymas yra čia .

Jei turite prieigą prie „Intel Secure Key“ suderinamo procesoriaus, galite sukurti tikrus atsitiktinius numerius ir eilutes naudodami šias bibliotekas: https://github.com/JebteK/RdRand ir https://www.rdrand.com/

Tiesiog atsisiųskite naujausią versiją iš čia , įjunkite „Jebtek.RdRand“ ir pridėkite jį naudodami pareiškimą. Tada jums tereikia:

 bool isAvailable = RdRandom.GeneratorAvailable(); //Check to see if this is a compatible CPU string key = RdRandom.GenerateKey(10); //Generate 10 random characters string apiKey = RdRandom.GenerateAPIKey(); //Generate 64 random characters, useful for API keys byte[] b = RdRandom.GenerateBytes(10); //Generate an array of 10 random bytes uint i = RdRandom.GenerateUnsignedInt() //Generate a random unsigned int 

Jei neturite suderinamo procesoriaus, kad galėtumėte naudoti kodą, tiesiog naudokite „RESTful“ paslaugą „rdrand.com“. Su „RdRandom“ įvyniojimo biblioteka, įtraukta į jūsų projektą, jums tereikia tai padaryti (registracijos metu gausite 1000 nemokamų skambučių):

 string ret = Randomizer.GenerateKey(<length>, "<key>"); uint ret = Randomizer.GenerateUInt("<key>"); byte[] ret = Randomizer.GenerateBytes(<length>, "<key>"); 
3
27 марта '14 в 22:36 2014-03-27 22:36 atsakymą pateikė JebaDaHutas kovo 27 d. 14 d. 10:36 2014-03-27 22:36
 Random rand = new Random(); int name = rand.Next() 

Įdėkite visas norimas vertes į antrą turinį, kad įsitikintumėte, jog įvedėte pavadinimą rašydami užuominą ir dvigubą skirtuką, kad sukurtumėte kodą

2
25 июня '14 в 5:28 2014-06-25 05:28 atsakymą pateikė vartotojo3773367 „birželio 25 d. 14 d. 5:28 2014-06-25 05:28

Numeriai, kuriuos kompiuteris apskaičiavo per deterministinį procesą, pagal apibrėžimą negali būti atsitiktiniai.

Jei jums reikia realių atsitiktinių skaičių, atsitiktinumas atsiranda dėl atmosferos triukšmo ar radioaktyvaus skilimo.

Galite pabandyti, pavyzdžiui, RANDOM.ORG (tai sumažina našumą)

1
14 марта '16 в 16:58 2016-03-14 16:58 Atsakymą pateikė Stefano Lonati kovo 14 d., 16 val. 16:58 2016-03-14 16:58

Norėjau parodyti, kas atsitinka, kai kiekvieną kartą naudojamas naujas atsitiktinis generatorius. Tarkime, jūs turite du metodus arba dvi klases, kurių kiekvienas reikalauja atsitiktinio skaičiaus. Ir jūs naiviai juos koduojate, pavyzdžiui:

 public class A { public A() { var rnd=new Random(); ID=rnd.Next(); } public int ID { get; private set; } } public class B { public B() { var rnd=new Random(); ID=rnd.Next(); } public int ID { get; private set; } } 

Ar manote, kad gausite du skirtingus identifikatorius? NOPE

 class Program { static void Main(string[] args) { A a=new A(); B b=new B(); int ida=a.ID, idb=b.ID; // ida = 1452879101 // idb = 1452879101 } } 

Sprendimas yra visada naudoti vieną statinį atsitiktinį generatorių. Čia jis yra:

 public static class Utils { public static readonly Random random=new Random(); } public class A { public A() { ID=Utils.random.Next(); } public int ID { get; private set; } } public class B { public B() { ID=Utils.random.Next(); } public int ID { get; private set; } } 
1
08 апр. atsakymas duotas ja72 08 balandžio. 2016-04-08 22:24 '16 at 22:24 pm 2016-04-08 22:24

Dėl stiprių atsitiktinių sėklų aš visada naudoju CryptoRNG, o ne Time.

 using System; using System.Security.Cryptography; public class Program { public static void Main() { var random = new Random(GetSeed()); Console.WriteLine(random.Next()); } public static int GetSeed() { using (var rng = new RNGCryptoServiceProvider()) { var intBytes = new byte[4]; rng.GetBytes(intBytes); return BitConverter.ToInt32(intBytes, 0); } } } 
1
25 мая '18 в 20:53 2018-05-25 20:53 Atsakymą davė Davit Tvildiani gegužės 18 d. 18 val. 20:53 2018-05-25 20:53

Greitai ir lengvai įdėkite, naudokite toliau pateiktą kodą:

 new Random().Next(min, max); // for example unique name strName += "_" + new Random().Next(100, 999); 
0
10 мая '18 в 10:48 2018-05-10 10:48 Atsakymą pateikė Zolfaghari gegužės 10-18 d. 10:48 2018-05-10 10:48

Kelis kartus naudokite vieną atsitiktinės atrankos kopiją.

 // Somewhat better code... Random rng = new Random(); for (int i = 0; i < 100; i++) { Console.WriteLine(GenerateDigit(rng)); } ... static int GenerateDigit(Random rng) { // Assume there'd be more logic here really return rng.Next(10); } 

Šiame straipsnyje aptariama, kodėl tikimybė sukelia tiek daug problemų, ir kaip jas išspręsti. http://csharpindepth.com/Articles/Chapter12/Random.aspx

0
14 июня '18 в 15:08 2018-06-14 15:08 atsakymą pateikė „ Ankit Agarwal “ birželio 18 d. 18 val. 15:18 2018-06-14 15:08

Galite išbandyti atsitiktinę pradinę vertę, naudodami žemiau:

 var rnd = new Random(11111111); //note: seed value is 11111111 string randomDigits = rnd.Next().ToString().Substring(0, 8); var requestNumber = $"SD-{randomDigits}"; 
0
22 апр. atsakymas pateikiamas Rejwanul Reja balandžio 22 d 2018-04-22 13:55 '18, 15:55 pm 2018-04-22 13:55

Išbandykite šiuos paprastus veiksmus, kad sukurtumėte atsitiktinius skaičius:

Sukurti funkciją:

 private int randomnumber(int min, int max) { Random rnum = new Random(); return rnum.Next(min, max); } 

Naudokite pirmiau nurodytą funkciją toje vietoje, kurioje norite naudoti atsitiktinius numerius. Tarkime, kad norite jį naudoti teksto lauke.

 textBox1.Text = randomnumber(0, 999).ToString(); 

0 yra minimalus, o 999 yra didžiausias. Vertes galite keisti norimu.

0
09 сент. Hani Mehdi atsakymas rugsėjo 09 d 2015-09-09 04:16 '15 at 4:16 2015-09-09 04:16

Aš visada turiu metodus, kurie generuoja atsitiktinius skaičius, kurie padeda įvairiems tikslams. Tikiuosi, kad tai taip pat padės jums:

 public class RandomGenerator { public int RandomNumber(int min, int max) { Random random = new Random(); return random.Next(min, max); } public string RandomString(int size, bool lowerCase) { StringBuilder builder = new StringBuilder(); Random random = new Random(); char ch; for (int i = 0; i < size; i++) { ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))); builder.Append(ch); } if (lowerCase) return builder.ToString().ToLower(); return builder.ToString(); } } 
0
15 мая '18 в 10:50 2018-05-15 10:50 atsakymą PatsonLeaner pateikė gegužės 15 d. 18 val. 10:50 2018-05-15 10:50

Kodėl gi ne naudoti int randomNumber = Random.Range(start_range, end_range) ?

0
19 марта '16 в 19:57 2016-03-19 19:57 Atsakymas, kurį pateikė Recomer, kovo 16, 16, 19:57 2016-03-19 19:57

Tikiuosi, kad šis kodas gali būti naudingas.

  public static string GeneratePassword() { string strPwdchar = "abcdefghijklmnopqrstuvwxyz0123456789#+@ string strPwd = ""; Random rnd = new Random(); for (int i = 0; i <= 7; i++) { int iRandom = rnd.Next(5, strPwdchar.Length - 1); strPwd += strPwdchar.Substring(iRandom, 1); } return strPwd; } 

Žaiskite su juo ... Tikiuosi, kad galite gauti tai, ko norite.

-1
03 дек. atsakymas pateikiamas 03 d. 2017-12-03 05:20 '17 at 5:20 am 2017-12-03 05:20

Deja, OP reikalauja atsitiktinės int reikšmės, tačiau paprastam tikslui dalytis žiniomis, jei norite atsitiktinės „ BigInteger vertės, galite naudoti tokį teiginį:

 BigInteger randomVal = BigInteger.Abs(BigInteger.Parse(Guid.NewGuid().ToString().Replace("-",""), NumberStyles.AllowHexSpecifier)); 
-1
08 дек. Ciro Corvino atsakymas 2018-12-08 17:38 '18, 17:38 pm 2018-12-08 17:38

Manau, kad norite tolygiai paskirstyto atsitiktinių skaičių generatoriaus, kaip parodyta žemiau. Atsitiktiniai skaičiai daugumoje programavimo kalbų, įskaitant C # ir C ++, prieš naudojant juos nėra tinkamai sumaišyti. Tai reiškia, kad vėl ir vėl gausite tą patį skaičių, o tai nėra atsitiktinumas. Norint, kad to paties skaičiaus nenukentėtų vėl ir vėl, jums reikia sėklų. Paprastai laiko užduotis yra tinkama. Atminkite, kad tą patį numerį gausite vėl ir vėl, jei kiekvieną kartą naudosite tą pačią sėklą. Taigi pabandykite visada naudoti skirtingas sėklas. Laikas yra geras sėklų šaltinis, nes jie visada painiojami.

 int GetRandomNumber(int min, int max) { Random rand = new Random((int)DateTime.Now.Ticks); return rand.Next(min, max); } 

jei ieškote atsitiktinio skaičiaus generatoriaus normaliam paskirstymui, galite naudoti „Box-Muller“ transformaciją. Patikrinkite atsakymą į „yoyoyoyosef“ atsitiktinio Gauso kintamojo klausimą. Kadangi jums reikalingas sveikasis skaičius, pabaigoje turite pridėti dvigubą vertę.

 Random rand = new Random(); //reuse this if you are generating many double u1 = 1.0-rand.NextDouble(); //uniform(0,1] random doubles double u2 = 1.0-rand.NextDouble(); double randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) * Math.Sin(2.0 * Math.PI * u2); //random normal(0,1) double randNormal = mean + stdDev * randStdNormal; //random normal(mean,stdDev^2) 

Atsitiktiniai Gauso kintamieji

-1
15 мая '18 в 0:52 2018-05-15 00:52 atsakymas pateikiamas auto9817 gegužės 15 d., 18 val. 0:52 2018-05-15 00:52
  int n = new Random().Next(); 

Taip pat galite nurodyti minimalią ir maksimalią reikšmę Next() funkcijai. Kaip

  int n = new Random().Next(5,10); 
-3
08 авг. atsakymas, kurį pateikė Muhammad Awais 08 rugpjūčio mėn 2016-08-08 12:31 '16 at 12:31 2016-08-08 12:31

Kiti klausimai apie žymes arba Ask a question