Her yaptığınızda new Random()
saat kullanılarak başlatılır. Bu, sıkı bir döngüde aynı değeri birçok kez elde ettiğiniz anlamına gelir. Tek bir tutmalı Rastgele örneği ve kullanmaya devam İleri üzerinde aynı örneği.
//Function to get a 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);
}
}
Düzenleme (yorumlara bakın): neden lock
buraya ihtiyacımız var?
Temel olarak, örneğin Next
iç durumunu değiştirecektir Random
. Biz birden çok iş parçacığı aynı anda o yaparsanız olabilir iddia "Biz sadece sonuç daha rastgele yaptık" ama ne biz edilir aslında potansiyel olarak iç uygulanmasını kırılıyor yapıyor ve biz de aynı numaraları almak başlayabileceğini farklı iplikler, gelen olabilir ve olmayabilir - bir sorun. Bununla birlikte, dahili olarak ne olacağının garantisi daha büyük bir sorundur; çünkü Random
yok değil parçacığı güvenliği hiçbir garanti. Dolayısıyla iki geçerli yaklaşım vardır:
- Farklı iş parçacıklarından aynı anda erişmemiz için senkronize edin
Random
Her iş parçacığı için farklı örnekler kullanın
Her ikisi de iyi olabilir; ancak aynı anda birden çok arayandan gelen tek bir örneği kesmek , sadece sorun istemektir.
lock
Bu yaklaşımların birinci (ve daha basit) ulaşır; ancak, başka bir yaklaşım şöyle olabilir:
private static readonly ThreadLocal<Random> appRandom
= new ThreadLocal<Random>(() => new Random());
bu iş parçacığı başına yapılır, bu nedenle senkronize etmeniz gerekmez.
new Random().Next((int)0xFFFF, (int)0xFFFFFF) % 256);
daha iyi "rastgele" sayılar.Next(0, 256)