码迷,mamicode.com
首页 > Windows程序 > 详细

c# 常用操作保留

时间:2015-03-09 15:42:52      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:

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
RanDom提高种子随机率

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)); 

进制转换
View Code

 

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;
        }
32位 MD5加密
技术分享
/// <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);
        }
16位 MD5加密

 

c# 常用操作保留

标签:

原文地址:http://www.cnblogs.com/eye-like/p/4323518.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!