放羊的博客

万能的技术,苦逼的技术.

C#生成随机数

2014-06-14

用C#生成随机数的相关资料,在移动硬盘上发现的,先放进来,网上找的,忘记了原文网址了。

导语引言

随机数说明

.net.Frameword 中提供了一个专门产生随机数的类 System.Random

随机数生成器基本使用

我们可以使用两种方式初始化一个随机数发生器,微软的随机数生成器为我们提供了两种方式初始化一个随机数生成器。

一种是默认的构造函数Random generator = new Random();,用该方法初始化的生成器.net.Frameword使用与时间相关的默认种子值为我们创建出一个随机数生成器;

第二种是使用指定的随机种子值初始化一个随机生成器;

1
Random ro = new Random(10);

1
Random ra = new Random(unchecked((int)DateTime.Now.Ticks));
1
2
long tick = DateTime.Now.Ticks;
Random ran = new Random((int)(DateTime.Now.Ticks & 0xffffffffL) | (int)(tick >> 32));

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Random ro = new Random(iSeed());
static int iSeed() //有返回值,叫子函数(VB),无返回值,叫子程序(VB);;;C#中,统一叫方法.
{
    //一个子方法,跟据tick产生随机数的种子
    long tick = 987654123;//定义一干扰常数,9位数且尾数不为0,自定
    tick = tick * (System.DateTime.Now.Millisecond + System.DateTime.Now.Month);//乘以毫秒为干扰
    tick = tick + System.DateTime.Now.Ticks; //加上tick,主变量
    tick = tick + System.Environment.TickCount * (System.DateTime.Now.Millisecond + System.DateTime.Now.Year);//开机毫秒数
    tick = tick + System.Environment.WorkingSet * (System.DateTime.Now.Millisecond + System.DateTime.Now.Day);//内存干扰
    string sTick = tick.ToString();//将tick转换为字符;
    Console.WriteLine("转换为字符的64位Long " + sTick);
    string sSeed = sTick.Substring(sTick.Length - 10); //先取10位
    if (Convert.ToDouble(sSeed) > 2147483642) // 聪明不可用尽,int32亦不取尽
    {
        sSeed = sTick.Substring(sTick.Length - 9); //溢出int32正数,则取9位
    }
    return Convert.ToInt32(sSeed); //转换为int32数字,把算出的数,给回去iSeed,呵呵~~
    //一个子方法,跟据tick产生随机数的种子
}
1
2
3
4
5
6
7
8
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());

参考文档