Pertanyaan Bagaimana saya menghasilkan nomor int acak di C #?


Bagaimana cara menghasilkan integer acak di C #?


1427
2018-04-24 23:09


asal


Jawaban:


Itu Random kelas digunakan untuk membuat angka acak. (Pseudo-random itu tentu saja.).

Contoh:

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

Jika Anda akan membuat lebih dari satu nomor acak, Anda harus menyimpan Random misalnya dan menggunakannya kembali. Jika Anda membuat instance baru terlalu dekat pada waktunya, mereka akan menghasilkan seri angka acak yang sama dengan generator acak yang diunggulkan dari jam sistem.


1889
2018-04-24 23:19



Setiap kali Anda melakukan Random baru () diinisialisasi. Ini berarti bahwa dalam lingkaran yang ketat Anda mendapatkan nilai yang sama berkali-kali. Anda harus menyimpan satu instance Random dan tetap menggunakan Next pada instance yang sama.

//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



Pertanyaannya terlihat sangat sederhana tetapi jawabannya agak rumit. Jika Anda melihat hampir semua orang menyarankan untuk menggunakan kelas Random dan beberapa menyarankan untuk menggunakan kelas crypto RNG. Tapi kemudian kapan harus memilih apa.

Untuk itu pertama-tama kita perlu memahami istilah RANDOMNESS dan filosofi di baliknya.

Saya akan mendorong Anda untuk menonton video ini yang lebih mendalam dalam filsafat RANDOMNESS menggunakan C # https://www.youtube.com/watch?v=tCYxc-2-3fY 

Pertama-tama mari kita memahami filosofi RANDOMNESS. Ketika kita memberitahu seseorang untuk memilih antara MERAH, HIJAU dan KUNING apa yang terjadi secara internal. Apa yang membuat seseorang memilih RED atau YELLOW atau GREEN?

c# Random

Beberapa pemikiran awal masuk ke pikiran orang yang memutuskan pilihannya, itu bisa menjadi warna favorit, warna keberuntungan dan sebagainya. Dengan kata lain beberapa pemicu awal yang kita sebut RANDOM sebagai SEED. SEED ini adalah titik awal, pemicu yang mendorongnya untuk memilih nilai RANDOM.

Sekarang jika SEED mudah ditebak, maka angka acak tersebut disebut sebagai SEMU dan ketika benih sulit untuk menebak angka-angka acak tersebut diistilahkan DIPERBAIKI nomor acak.

Misalnya seseorang memilih warna tergantung pada kombinasi cuaca dan suara maka akan sulit menebak benih awal.

c# Random

Sekarang izinkan saya membuat pernyataan penting: -

* Kelas “Random” hanya menghasilkan nomor acak PSEUDO dan untuk menghasilkan nomor acak SECURE kita perlu menggunakan kelas “RNGCryptoServiceProvider”.

c# Random

Kelas acak mengambil nilai benih dari jam CPU Anda yang sangat dapat diprediksi. Jadi dengan kata lain kelas RANDOM dari C # menghasilkan angka acak pseudo, di bawah ini adalah kode yang sama.

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

Sedangkan kelas RNGCryptoServiceProvider menggunakan OS entropi untuk menghasilkan biji. OS entropy adalah nilai acak yang dihasilkan menggunakan suara, klik mouse dan timing keyboard, suhu termal dll. Di bawah ini berlaku kode untuk yang sama.

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

Untuk memahami entropi OS, lihat video ini https://www.youtube.com/watch?v=tCYxc-2-3fY   dari 11:20 di mana logika dari entropi OS dijelaskan. Jadi, kata-kata sederhana RNG Crypto menghasilkan angka acak SECURE.


151
2018-06-14 06:27



Hati-hati itu new Random() diunggulkan pada stempel waktu saat ini.

Jika Anda ingin menghasilkan hanya satu nomorKamu dapat memakai:

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

Untuk informasi lebih lanjut, lihat di Acak kelas, harap dicatat:

Namun, karena jam memiliki resolusi yang terbatas, menggunakan konstruktor parameterless untuk membuat objek Random yang berbeda secara berurutan menghasilkan generator angka acak yang menghasilkan urutan identik dari bilangan acak

Jadi jangan gunakan kode ini untuk menghasilkan serangkaian nomor acak.


72
2018-04-24 23:10



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

42
2018-04-24 23:10



Saya ingin menambahkan versi yang aman secara kriptografi:

Kelas RNGCryptoServiceProvider (MSDN atau dotnetperls)

Ini mengimplementasikan 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



lebih baik menaburkan objek Random dengan milidetik saat ini, untuk memastikan nomor acak yang benar, dan Anda hampir tidak akan menemukan duplikat menggunakannya berkali-kali

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

13
2017-11-01 12:30