日期:2014-05-18 浏览次数:21021 次
public class GaussianRNG
{
int iset;
double gset;
Random r1, r2;
public GaussianRNG()
{
r1 = new Random(unchecked((int)DateTime.Now.Ticks));
r2 = new Random(~unchecked((int)DateTime.Now.Ticks));
iset = 0;
}
public double Next()
{
double fac, rsq, v1, v2;
if (iset == 0) {
do {
v1 = 2.0 * r1.NextDouble() - 1.0;
v2 = 2.0 * r2.NextDouble() - 1.0;
rsq = v1*v1 + v2*v2;
} while (rsq >= 1.0 || rsq == 0.0);
fac = Math.Sqrt(-2.0*Math.Log(rsq)/rsq);
gset = v1*fac;
iset = 1;
return v2*fac;
} else {
iset = 0;
return gset;
}
}
}
------解决方案--------------------
楼上方法,用时间来做种子,是可以。
------解决方案--------------------
RNGCryptoServiceProvider就是随机数发生器啊,你不看MSDN吗?
RNGCryptoServiceProvider generator = new RNGCryptoServiceProvider(); generator.GetBytes(randomNumber); int rand = Convert.ToInt32(randomNumber[0]);
------解决方案--------------------
RNGCryptoServiceProvider是CSP的随机数发生器,跟你用什么加密算法没关系...你可以直接用在RSA算法中,他们是各自独立的...
------解决方案--------------------
虽然都叫CryptoServiceProvider,可不是说他们是同类...RSACryptoServiceProvider是RSA算法提供程序,和RNGCryptoServiceProvider压根儿就不是一个类型...好好学英文...
再有,这种强度更大的CSP随机数发生器一般只用于CSP算法...你一个随机取字符的小玩意儿不需要用这种,Random就够用了...
------解决方案--------------------
你们都误解RNGCryptoServiceProvider类了!
RNGCryptoServiceProvider是做什么的?CryptoServiceProvider是抽象类RandomNumberGenerator的具体实现,他就是一个RandomNumberGenerator,专门为加解密算法而设计的随机数生成类。
专门来生成安全性极高的随机数,专门用于填充那些Key或IV的!
RNGCryptoServiceProvider名字包含里有CryptoServiceProvider,但他不是专门给CSP所调用的CryptoAPI服务的(纠正11楼错误),他是RNG的的CryptoAPI WinAPI实现,就像.NET中安全类库中的其他类一样,一个大的抽象类(如SHA1),分别有不同的实现子类,如SHA1Managed,SHA1CryptoServiceProvider,SHA1Cng分别代表(托管实现,CryptoAPI WINAPI实现,和下一代CryptoAPI(CNG))。
如下用RNG随即填充一个数组
System.Security.Cryptography.RandomNumberGenerator gen = System.Security.Cryptography.RandomNumberGenerator.Create();
byte[] data = new byte[100];
gen.GetBytes(data);
------解决方案--------------------
经过加密后的数据相对原数据会有非常大的变化,貌似你问这么多其实只想要从一个数组中随即返回一个数字?或者随机打乱数组排序?
static Random r = new Random();
public static void Main()
{
int[] a = { 7, 2, 3, 6, 8, 44, 1, 8 };
Console.WriteLine("随机返回:" + RandomRet(a));
Console.WriteLine("随机排序");
foreach (int i in RandomSort(a))
Console.WriteLine(i);
}
static T RandomRet<T>(T[] array)
{
return array[r.Next(array.Length)];
}
static T[] RandomSort<T>(T[] array) where T : IComparable<T>
{
return array.OrderBy(i => r.Next()).ToArray();
}