【发布时间】:2011-12-16 00:17:22
【问题描述】:
我需要使用随机类在公共静态函数内的多线程应用程序中生成随机数。我怎样才能实现它。目前,下面的功能运行良好,但与随机类相比并不是很快。所以我需要修改下面的函数并使其与随机类一起工作,而该类正在发生数千个并发调用。如果我使用随机它对我认为的每个调用都使用相同的种子,并且随机化非常糟糕。 我现在的班级
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Security.Cryptography;
public static class GenerateRandomValue
{
static RNGCryptoServiceProvider Gen = new RNGCryptoServiceProvider();
public static int GenerateRandomValueDefault(int irRandValRange)//default min val 1
{
if (irRandValRange == 0)
irRandValRange = 1;
byte[] randomNumber = new byte[4]; // 4 bytes per Int32
Gen.GetBytes(randomNumber);
return Math.Abs(BitConverter.ToInt32(randomNumber, 0) % irRandValRange) + 1;
}
public static int GenerateRandomValueMin(int irRandValRange, int irMinValue)
{
byte[] randomNumber = new byte[4]; // 4 bytes per Int32
Gen.GetBytes(randomNumber);
return BitConverter.ToInt32(randomNumber, 0) % irRandValRange + irMinValue;
}
}
另一个看起来不错且线程安全的函数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Threading;
public static class GenerateRandomValue
{
private static Random seedGenerator = new Random();
private static ThreadLocal<Random> random = new ThreadLocal<Random>(SeededRandomFactory);
private static Random SeededRandomFactory()
{
lock(seedGenerator)
return new Random(seedGenerator.Next());
}
public static int GenerateRandomValueMin(int irRandValRange, int irMinValue)
{
return random.Value.Next(irMinValue, irRandValRange);
}
}
【问题讨论】:
-
Random类不够好有什么原因吗? -
没用?以什么方式?如果您只对速度感兴趣,那很好。您没有指定其他任何内容。请做。
-
我建议阅读:random.org/randomness
-
@MontsterMMORPG:如果你解释一下“随机完美”的实际含义——即你的实际要求是什么——那么你可能会得到一些更中肯的答案。
-
@MonsterMMORPG 你应该编辑你的帖子并清楚简洁地解释你正在尝试做什么,你目前是如何做的,它到底是如何不工作的,以及你的要求是什么。