在Random生成随机数的时候,如果短时间内连续生成随机数,就会导致生成的随机数相同。下面我们介绍如何解决在 短时间内生成随机数的时候,如何避免随机数不一样的问题。
(实例下载链接:http://download.csdn.net/download/shuai_wy/10128989)
补充:即使我们生成随机数的区间不一样,但是仍然面临这个问题,区间里的点是一样的。
举个栗子:
假设我们要生成 [33,35], [8,10], 我们用这两个区间短时间内生成随机数,就会发现:
第一个区间生成的是 33 的时候,第二个区间生成的是 8; 第一个区间生成的是 34的时候,第二个区间生成的是 9;
一、 有效方案:
1. 提高随机数不重复概率的种子生成方法(推荐)
//获取随机种子
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( ) );
2. 延时
Thread.Sleep(100);
Random ran = new Random();
ran.Next();
二、其他生成随机数的方法实例
/// <summary>
/// 根据中位数返回区间随机数
/// </summary>
/// <param name="mid"></param>
/// <returns></returns>
private static int GetRandom(int mid)
{
//1.
//Random ran = new Random();
//2.
//Random ran = new Random(new Guid().GetHashCode());
//3.
//long tick = DateTime.Now.Ticks;
//Random ran = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32));
//4.(*有效方法)
//Thread.Sleep(100);
//Random ran = new Random();
//5.(*有效方法)
Random ran = new Random(GetRandomSeed());
return ran.Next(mid -5,mid +10);
}
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);
}
//控制台打印,测试一下
static void Main(string[] args)
{
int count = 0;
Random ran = new Random();
int mid = 33;
while (count < 50)
{
Console.WriteLine(GetRandom(mid));
count++;
}
Console.ReadKey();
}
生成随机数运行截图:
参考博文及实例
c# Random太快产生的随机数会重复: https://www.cnblogs.com/TouchAfflatus/p/3784225.html