标签:
RanDom如何提高生成随机数的随机性
一个在线考试系统的项目,需要从题库中随机抽取试题,但是如果直接 Random ran=new Randon(),ran.Next(nummin,nummax);的方法,
在系统执行过快的情况下,造成只取到了一系列连续的题目,其他的题目均没有取到,用下面提高随机数种子的方法搞定
用C#的Random函数连续的生成随机数,会发现结果往往都是一个值。原因就是Random函数需要一个种子,人为指定的方式是Random(i),如果没有明确指定种子的话,系统会自动用当前系统时间作为种子。如果程序执行过快就会造成,种子一样的情况,这时候产生的随机数就是同一个值。解决方案如下: Random类是一个产生伪随机数字的类,它的构造函数有两种,一个是直接New Random(),另外一个是New Random(Int32),前者是根据触发那刻的系统时间做为种子,来产生一个随机数字,后者可以自己设定触发的种子,一般都是用UnCheck((Int)DateTime.Now.Ticks)做为参数种子,因此如果计算机运行速度很快,如果触发Randm函数间隔时间很短,就有可能造成产生一样的随机数,因为伪随机的数字,在Random的内部产生机制中还是有一定规律的,并非是真正意义上的完全随机。 Random快速连续产生相同随机数的解决方案: 1、延时的办法。 可以采用for循环的办法,也可以采用Thread.Sleep(100); 2、提高随机数不重复概率的种子生成方法: static int GetRandomSeed( ) { byte[] bytes = new byte[4]; System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider( ); rng.GetBytes( bytes ); return BitConverter.ToInt32( bytes , 0 ); } Random random = new Random( GetRandomSeed( ) ); 引用:http://blog.sina.com.cn/s/blog_67f16f3d0100xsdd.html
c#不同进制之间的相互转换
//十进制转二进制 Console.WriteLine(Convert.ToString(69, 2)); //十进制转八进制 Console.WriteLine(Convert.ToString(69, 8)); //十进制转十六进制 Console.WriteLine(Convert.ToString(69, 16)); //二进制转十进制 Console.WriteLine(Convert.ToInt32(”100111101″, 2)); //八进制转十进制 Console.WriteLine(Convert.ToInt32(”76″, 8)); //C# 16进制转换10进制 Console.WriteLine(Convert.ToInt32(”FF”, 16)); 进制转换
MD5 加密
/// <summary> ///32位 md5加密 /// </summary> /// <param name="str"></param> /// <returns></returns> public static string GetMD5_32(string str) { byte[] arrHashInput; byte[] arrHashOutput; //MD5CryptoServiceProvider objMD5 = new MD5CryptoServiceProvider(); MD5 objMD5 = new MD5CryptoServiceProvider(); arrHashInput = C2B(str); arrHashOutput = objMD5.ComputeHash(arrHashInput); return BitConverter.ToString(arrHashOutput); } protected static byte[] C2B(string str) { char[] arrChar; arrChar = str.ToCharArray(); byte[] arrByte = new byte[arrChar.Length]; for (int i = 0; i < arrChar.Length; i++) { arrByte[i] = Convert.ToByte(arrChar[i]); } return arrByte; }
/// <summary> /// 16位 MD5加密 /// </summary> /// <param name="sInputString"></param> /// <returns></returns> public static string GetMD5_16(string sInputString) { byte[] data = Encoding.UTF8.GetBytes(sInputString); DESCryptoServiceProvider DES = new DESCryptoServiceProvider(); string sKey = GenerateKey(); DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey); DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey); ICryptoTransform desencrypt = DES.CreateEncryptor(); byte[] result = desencrypt.TransformFinalBlock(data, 0, data.Length); return BitConverter.ToString(result); } // 创建Key public static string GenerateKey() { DESCryptoServiceProvider desCrypto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create(); return ASCIIEncoding.ASCII.GetString(desCrypto.Key); } // 加密字符串 public static string EncryptString(string sInputString, string sKey) { byte[] data = Encoding.UTF8.GetBytes(sInputString); DESCryptoServiceProvider DES = new DESCryptoServiceProvider(); DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey); DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey); ICryptoTransform desencrypt = DES.CreateEncryptor(); byte[] result = desencrypt.TransformFinalBlock(data, 0, data.Length); return BitConverter.ToString(result); } // 解密字符串 public static string DecryptString(string sInputString, string sKey) { string[] sInput = sInputString.Split("-".ToCharArray()); byte[] data = new byte[sInput.Length]; for (int i = 0; i < sInput.Length; i++) { data[i] = byte.Parse(sInput[i], NumberStyles.HexNumber); } DESCryptoServiceProvider DES = new DESCryptoServiceProvider(); DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey); DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey); ICryptoTransform desencrypt = DES.CreateDecryptor(); byte[] result = desencrypt.TransformFinalBlock(data, 0, data.Length); return Encoding.UTF8.GetString(result); }
标签:
原文地址:http://www.cnblogs.com/eye-like/p/4323518.html