关于生成不重复随机数组的问题?
2007-07-15 20:58
253 查看
有时候想测试一些模块的性能,不其然地就想到用机器自动生成一些测试数据来,随机数应该是最常用的一种,今天小弟就用了这种简单的方法,生成了上万个随机数,但是问题随之而来,看看生成的随机数组,当中的相临重复占了一大半,这样的测试用例如果用来测试一些排序模块的话,效果可想而知,看看msdn上面的事例,其中有句比较奇怪的代码,就是在循环中让线程停上一会,我仿照的代码如下:
static void RandomArray(ref int[] list)
...{
for (int i = 0; i < MAXSIZE; i++)
...{
Thread.Sleep(1);
list[i] = new Random().Next(1, 1024 * 1024);
}
}
回头看看,由于线程暂停了一下,随机种子就在那一刻发生了点变化,生成重复随机数的情况缓减了不少,单依然严重,而且更恐怖的问题是,如果生成在大量的数据,把线程一停再停,机子等得了,我可不当那个争着眼睛的傻瓜啊.
回头再查查msdn,发现了一个CSP提供的随机生成函数,由于是提供给密码生成所用,相邻重复性大大减少,而且运行效率还可以,具体实现代码如下:
/**//// <summary>
/// 生成随机测试数组
/// </summary>
/// <param name="list"></param>
static void RandomArray(ref int[] list)
...{
for (int i = 0; i < MAXSIZE; i++)
...{
//使用简单的随机数生成器
int randomNum = new Random().Next(1, 1024 * 1024);
//使用加密服务生成随机数
byte[] randomNumber = new byte[1];
RNGCryptoServiceProvider Gen = new RNGCryptoServiceProvider();
Gen.GetBytes(randomNumber);
//合成两者作为随机数
list[i] = Convert.ToInt32(randomNumber[0]) % randomNum + randomNum;
}
}
不过好像只可以生成一个Byte长度的随机数,再长好像就不支持了,所以不得不加上一些自己生成的随机数进行组合,不知道那位大大有更好的解决方案,望能告诉小弟一声,万分感激啊
static void RandomArray(ref int[] list)
...{
for (int i = 0; i < MAXSIZE; i++)
...{
Thread.Sleep(1);
list[i] = new Random().Next(1, 1024 * 1024);
}
}
回头看看,由于线程暂停了一下,随机种子就在那一刻发生了点变化,生成重复随机数的情况缓减了不少,单依然严重,而且更恐怖的问题是,如果生成在大量的数据,把线程一停再停,机子等得了,我可不当那个争着眼睛的傻瓜啊.
回头再查查msdn,发现了一个CSP提供的随机生成函数,由于是提供给密码生成所用,相邻重复性大大减少,而且运行效率还可以,具体实现代码如下:
/**//// <summary>
/// 生成随机测试数组
/// </summary>
/// <param name="list"></param>
static void RandomArray(ref int[] list)
...{
for (int i = 0; i < MAXSIZE; i++)
...{
//使用简单的随机数生成器
int randomNum = new Random().Next(1, 1024 * 1024);
//使用加密服务生成随机数
byte[] randomNumber = new byte[1];
RNGCryptoServiceProvider Gen = new RNGCryptoServiceProvider();
Gen.GetBytes(randomNumber);
//合成两者作为随机数
list[i] = Convert.ToInt32(randomNumber[0]) % randomNum + randomNum;
}
}
不过好像只可以生成一个Byte长度的随机数,再长好像就不支持了,所以不得不加上一些自己生成的随机数进行组合,不知道那位大大有更好的解决方案,望能告诉小弟一声,万分感激啊
相关文章推荐
- 关于从list或者数组中随机抽取部分不重复元素的问题探究
- 开辟一个空房间,随机生成一个有30个数的整形数组,找出其中的重复数字,输出其余数字
- js实现生成一个指定长度为n且随机不重复的数组
- 关于C++随机数生成中种子值设置的一点总结,解决随机数序列重复问题
- 随机生成1-100之间的数,并无一重复的存入长度为100的数组中
- 关于随机数无重复填充数组问题
- 几个关于随机数组产生的函数 包括各类可重复或不重复
- 在0~N(不包括N)范围内随机生成一个长度为M(M <= N)且内容不重复的数组
- JS生成不重复的随机数组的简单实例
- 生成随机无重复数组
- 【Java】随机生成不重复的字母数组
- 【Java】随机生成范围[min,max]之间的整数数组,且元素值不重复
- 生成一个不重复的随机数组
- net c#数组问题 声明一个100大小的数组 随机插入1-100之间的数,不能重复
- 关于去除JS数组中的重复元素问题
- 一个用来快速生成指定大小的随机不重复int数组的实用方法
- 一个关于去除数组重复元素的问题(C语言实现)
- C#声明一个100大小的数组 随机生成1-100之间不重复的数
- 关于生成一个随机数组
- 数组与集合的应用之常用集合的使用(用TreeSet生成不重复自动排序随机数组)