ここ
は(.NET 4.0が必要です)、それが私の感想です:
public static class RandomGenerator
{
private static object locker = new object();
private static Random seedGenerator = new Random(Environment.TickCount);
public static double GetRandomNumber()
{
int seed;
lock (locker)
{
seed = seedGenerator.Next(int.MinValue, int.MaxValue);
}
var random = new Random(seed);
return random.NextDouble();
}
}
とそれぞれの値が一意である千回の反復のためにそれをチェックするためのテスト:
[TestFixture]
public class RandomGeneratorTests
{
[Test]
public void GetRandomNumber()
{
var collection = new BlockingCollection<double>();
Parallel.ForEach(Enumerable.Range(0, 1000), i =>
{
var random = RandomGenerator.GetRandomNumber();
collection.Add(random);
});
CollectionAssert.AllItemsAreUnique(collection);
}
}
重複する値が返されることは絶対に保証されませんが、テストを10000回実行してテストに合格しました。
ランダムであれば常に同じ番号が与えられますが、正しいとは限りません。また、 'Random'はスレッドセーフではありません。 – dasblinkenlight
真の乱数を生成することは大きな問題であることにも注意してください。http://www.random.org/randomness/ –
非常に速くてスレッドセーフです。return 4; –