我需要在多个正在运行的线程中快速生成随机浮点数。我尝试过使用System.Random
,但它对于我的需求来说太慢了,并且它在多个线程中返回相同的数字。 (当我在单线程中运行应用程序时,它工作正常。)此外,我需要确保生成的数字在 0 到 100 之间。
这就是我现在正在尝试的:
number = random.NextDouble() * 100;
我应该尝试什么?
这是我的看法(需要 .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();
}
}
以及检查 1000 次迭代中每个值是否唯一的测试:
[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 次迭代的测试并且它通过了测试。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)