Pertanyaan Bagaimana cara saya memiliki dua randik berturut-turut memberikan nilai yang berbeda?


Misalnya, jika saya memiliki kelas:

public class Class
{
public Random r;

public Class()
{r= new Random()}
}

dan kemudian membuat dua contoh:

Class a = new Class();
Class b = new Class();

dan panggil r secara berurutan, r untuk keduanya akan memberikan nilai yang sama. Saya telah membaca bahwa ini karena konstruktor default untuk Random menggunakan waktu untuk menyediakan "keacakan," jadi saya bertanya-tanya bagaimana saya bisa mencegah ini. Terima kasih sebelumnya!


5
2018-06-16 05:20


asal


Jawaban:


Salah satu cara untuk mencapainya adalah dengan membuatnya r  static.

static berarti hanya satu Random r akan ada, dan itu akan dibagikan di semua contoh kelas.

Kode Anda akan terlihat seperti ini:

public class Class() { static Random r = new Random(); }

Class a = new Class();
Class b = new Class();

Jika Anda menggunakan threading, Anda bisa membuatnya [ThreadStatic] (sehingga setiap utas menggunakan instance sendiri dari kelas Acak)

Ada info tentang cara menggunakan [ThreadStatic]  sini - Saya belum pernah menggunakannya sendiri, tetapi terlihat cukup keren dan bagus, dan menyingkirkan semua masalah yang terkait dengan threading yang potensial.


5
2018-06-16 05:22



Pembuat kelas Acak didasarkan pada waktu. Jadi ketika Anda membuat mereka dalam urutan cepat - mereka mendapatkan benih yang sama dan kemudian akan menghasilkan nilai yang sama.

Jadi, Anda perlu berbagi Random untuk kelas Anda dengan beberapa cara -atau- sediakan benih awal yang berbeda.


4
2018-06-16 05:23



Salah satu kemungkinan dalam hal ini adalah membuat Random menjadi statis sehingga hanya dipakai sekali saja.

public class Class{
  private static Random r = new Random();        
  //the rest of your class
}

Masalahnya adalah Anda membuat dua kelas pada waktu yang hampir bersamaan, oleh karena itu mereka akan menggunakan benih yang sama (karena didasarkan pada waktu saat ini di antara hal-hal lain), dan akan menghasilkan urutan angka yang sama.


2
2018-06-16 05:23



Coba ini:

public class TestClass
{
    private static int seed = Environment.TickCount;


    public TestClass()
    {
        DoStuff();
        DoStuff();
        DoStuff();
        DoStuff();
    }

    private void DoStuff()
    {
        var random = new Random(seed++);
        int index = random.Next(30) + 1;

        //Console.Write(index);
    }
}

1
2018-06-16 05:29