SORU
20 NİSAN 2009, PAZARTESİ


Tek bir rastgele sayı üretme rastgele sayı üreteci

Aşağıdaki işlevi var:

//Function to get random number
public static int RandomNumber(int min, int max)
{
    Random random = new Random();
    return random.Next(min, max);
}

Nasıl derim:

byte[] mac = new byte[6];
for (int x = 0; x < 6;   x)
    mac[x] = (byte)(Misc.RandomNumber((int)0xFFFF, (int)0xFFFFFF) % 256);

Eğer çalışma sırasında hata ayıklayıcı ile bu döngü adım atarsam farklı değerler istediğim şeydir). Eğer iki satır kod aşağıda bir kesme koydum, ancak tüm üyeleri "mac" dizi eşit değere sahip.

Neden böyle oluyor?

CEVAP
20 NİSAN 2009, PAZARTESİ


new Random() her zaman saati kullanarak başlatıldı. Bu sıkı bir döngü içinde aynı değer birçok kez almak anlamına gelir. *7.* tek bir örnek tutun ve Next kullanmaya devam edebilirsinizaynıörnek.

//Function to get random number
private static readonly Random random = new Random();
private static readonly object syncLock = new object();
public static int RandomNumber(int min, int max)
{
    lock(syncLock) { // synchronize
        return random.Next(min, max);
    }
}

Edit (açıklama): neden lock burada ihtiyacımız var mı?

Temelde, Next Random örnek iç durumu değiştirecek. Eğer birden çok iş parçacığı aynı anda yaparsakolabilir"sadece sonucu daha da rasgele yaptık", ama . iddia ^em>aslındaişin potansiyel olarak iç uygulama kırılıyor, ve aynı zamanda farklı iş parçacıkları aynı numaraları çekmeye başlayın edebilirizolabilirbir sorun ve olmayabilir. Ne olacağı garanti dahili Random yok çünkü ortada daha büyük bir sorun olsa da;değiliş parçacığı güvenliği garanti olun. Böylece iki geçerli yaklaşım vardır:

  • farklı bir iş parçacığı tarafından aynı anda erişim değiliz o kadar senkronize
  • başına iş parçacığı Random farklı örneklerini kullanın

ikiside güzel olabilir; ama bir mutasyon geçiriyortekaynı anda birden çok arayanlardan örneği bela arıyor demektir.

lock ilk (ve) daha basit bu yaklaşım sağlar; ancak, başka bir yaklaşım olabilir:

private static readonly ThreadLocal<Random> appRandom
     = new ThreadLocal<Random>(() => new Random());

bu daha sonra başına iş parçacığı, eşitlemek gerek yok.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Angry Paintballer

    Angry Paintb

    8 Ocak 2012
  • Dave Wallace

    Dave Wallace

    27 Kasım 2007
  • World Science Festival

    World Scienc

    1 Mayıs 2008