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
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.
.NET Çerçeve: Rastgele sayı üreteci ür...
İyi bir rastgele sayı oyunu için jener...
Nasıl C rastgele bir sayı oluşturmak i...
Neden MongoDB Java driver rastgele bir...
<rastgele> Linux içinde aynı say...