日期:2014-05-18 浏览次数:20833 次
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(); }