csharp快速连续产生相同随机数的解决方案总结.docx
- 文档编号:13725326
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:6
- 大小:16.75KB
csharp快速连续产生相同随机数的解决方案总结.docx
《csharp快速连续产生相同随机数的解决方案总结.docx》由会员分享,可在线阅读,更多相关《csharp快速连续产生相同随机数的解决方案总结.docx(6页珍藏版)》请在冰点文库上搜索。
csharp快速连续产生相同随机数的解决方案总结
csharp快速连续产生相同随机数的解决方案总结
c#Random快速连续产生相同随机数的解决方案
Random类是一个产生伪随机数字的类,它的构造函数有两种,一个是直接New
Random,另外一个是NewRandom(Int32),前者是根据触发那刻的系统时间做为种子,来产生一个随机数字,后者可以自己设定触发的种子,一般都是用
UnCheck((Int))做为参数种子,因此如果计算机运行速度很快,如果触发Randm函数间隔时间很短,就有可能造成产生一样的随机数,因为伪随机的数字,在Random的内部产生机制中还是有一定规律的,并非是真正意义上的完全随机。
Random快速连续产生相同随机数的解决方案:
1、延时的办法。
可以采用for循环的办法,也可以采用(100);2、提高随机数不重复概率的种子生成方法:
Random类
命名空间:
System
表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备。
伪随机数是以相同的概率从一组有限的数字中选取的。
所选数字并不具有完全的随机性,因为它们是用一种确定的数学算法选择的,但是从实用的角度而言,其随机程度已足够了。
伪随机数的生成是从种子值开始。
如果反复使用同一个种子,就会生成相同的数字系列。
产生不同序列的一种方法是使种子值与时间相关,从而对于Random的每个新实例,都会产生不同的系列。
默认情况下,Random类的无参数构造函数使用系统时钟生成其种子值,而参数化构造函数可根据当前时间的计时周期数采用Int32值。
但是,因为时钟的分辨率有限,所以,如果使用无参数构造函数连续创建不同的Random对象,就会创建生成相同随机数序列的随机数生成器。
通过创建单个而不是多个Random对象可以避免此问题。
若要提高性能,请创建一个随时间推移能生成多个随机数的Random对象,而不要反复新建会生成同一个随机数的Random对象。
Random成员
名称●说明
Equals●确定指定的Object是否等于当前的Object。
Finalize●允许Object在“垃圾回收”回收Object之前尝试释放资源并执行其他清理操作。
GetHashCode●用作特定类型的哈希函数。
GetType●获取当前实例的Type。
MemberwiseClone●创建当前Object的浅表副本。
Next●已重载。
返回随机数。
NextBytes●用随机数填充指定字节数组的元素。
NextDouble●返回一个介于和之间的随机数。
Sample●返回一个介于和之间的随机数。
ToString●返回表示当前Object的String。
用C#生成不重复的随机数中国IT实验室收集整理20XX-4-2
我们可以使用两种方式初始化一个随机数发生器:
第一种方法不指定随机种子,系统自动选取当前时间作为随机种子:
Randomro=newRandom;
第二种方法可以指定一个int型参数作为随机种子:
intiSeed=10;
Randomro=newRandom(10);longtick=;
Randomran=newRandom((int)(tick&0xffffffffL)|(int)(tick>>32));这样可以保证99%不是一样。
之后,我们就可以使用这个Random类的对象来产生随机数,这时候要用到方法。
这个方法使用相当灵活,你甚至可以指定产生的随机数的上下限。
不指定上下限的使用如下:
intiResult;iResult=;
下面的代码指定返回小于100的随机数:
intiResult;intiUp=100;
iResult=(iUp);
而下面这段代码则指定返回值必须在50-100的范围之内:
intiResult;intiUp=100;intiDown=50;
iResult=(iDown,iUp);
除了方法之外,Random类还提供了方法产生一个范围在
之间的随机的双精度浮点数:
doubledResult;
dResult=;
但是用Random类生成题号,会出现重复,特别是在数量较小的题目中要生成不重复的的题目是很难的。
参考了网上的一些方法,找到两类解决方法,一类是通过随机种子入手,使每一次的随机种子不同,来保证不重复;第二类是使用一些数据结构和算法。
下面主要就第二类介绍几个方法:
方法1:
思想是用一个数组来保存索引号,先随机生成一个数组位置,然后把这个位置的索引号取出来,并把最后一个索引号复制到当前的数组位置,然后使随机数的上限减一,具体如:
先把这100个数放在一个数组内,每次随机取一个位置,将该位置的数用最后的数代替。
intindex=newint[15];for(inti=0;i
///产生一个非负数的乱数 /// publicstaticintNext {
(rb);
intvalue=(rb,0); if(value
///产生一个非负数且最大值在max以下的乱数 ///
///
publicstaticintNext(intmax) {
(rb);
intvalue=(rb,0); value=value%(max+1); if(value
///产生一个非负数且最小值在min以上最大值在max以下的乱数 ///
///
///
publicstaticintNext(intmin,intmax) {
intvalue=Next(max-min)+min; returnvalue; }
c#Random快速连续产生相同随机数的解决方案
Random类是一个产生伪随机数字的类,它的构造函数有两种,一个是直接New
Random,另外一个是NewRandom(Int32),前者是根据触发那刻的系统时间做为种子,来产生一个随机数字,后者可以自己设定触发的种子,一般都是用
UnCheck((Int))做为参数种子,因此如果计算机运行速度很快,如果触发Randm函数间隔时间很短,就有可能造成产生一样的随机数,因为伪随机的数字,在Random的内部产生机制中还是有一定规律的,并非是真正意义上的完全随机。
Random快速连续产生相同随机数的解决方案:
1、延时的办法。
可以采用for循环的办法,也可以采用(100);2、提高随机数不重复概率的种子生成方法:
Random类
命名空间:
System
表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备。
伪随机数是以相同的概率从一组有限的数字中选取的。
所选数字并不具有完全的随机性,因为它们是用一种确定的数学算法选择的,但是从实用的角度而言,其随机程度已足够了。
伪随机数的生成是从种子值开始。
如果反复使用同一个种子,就会生成相同的数字系列。
产生不同序列的一种方法是使种子值与时间相关,从而对于Random的每个新实例,都会产生不同的系列。
默认情况下,Random类的无参数构造函数使用系统时钟生成其种子值,而参数化构造函数可根据当前时间的计时周期数采用Int32值。
但是,因为时钟的分辨率有限,所以,如果使用无参数构造函数连续创建不同的Random对象,就会创建生成相同随机数序列的随机数生成器。
通过创建单个而不是多个Random对象可以避免此问题。
若要提高性能,请创建一个随时间推移能生成多个随机数的Random对象,而不要反复新建会生成同一个随机数的Random对象。
Random成员
名称●说明
Equals●确定指定的Object是否等于当前的Object。
Finalize●允许Object在“垃圾回收”回收Object之前尝试释放资源并执行其他清理操作。
GetHashCode●用作特定类型的哈希函数。
GetType●获取当前实例的Type。
MemberwiseClone●创建当前Object的浅表副本。
Next●已重载。
返回随机数。
NextBytes●用随机数填充指定字节数组的元素。
NextDouble●返回一个介于和之间的随机数。
Sample●返回一个介于和之间的随机数。
ToString●返回表示当前Object的String。
用C#生成不重复的随机数中国IT实验室收集整理20XX-4-2
我们可以使用两种方式初始化一个随机数发生器:
第一种方法不指定随机种子,系统自动选取当前时间作为随机种子:
Randomro=newRandom;
第二种方法可以指定一个int型参数作为随机种子:
intiSeed=10;
Randomro=newRandom(10);longtick=;
Randomran=newRandom((int)(tick&0xffffffffL)|(int)(tick>>32));这样可以保证99%不是一样。
之后,我们就可以使用这个Random类的对象来产生随机数,这时候要用到方法。
这个方法使用相当灵活,你甚至可以指定产生的随机数的上下限。
不指定上下限的使用如下:
intiResult;iResult=;
下面的代码指定返回小于100的随机数:
intiResult;intiUp=100;
iResult=(iUp);
而下面这段代码则指定返回值必须在50-100的范围之内:
intiResult;intiUp=100;intiDown=50;
iResult=(iDown,iUp);
除了方法之外,Random类还提供了方法产生一个范围在
之间的随机的双精度浮点数:
doubledResult;
dResult=;
但是用Random类生成题号,会出现重复,特别是在数量较小的题目中要生成不重复的的题目是很难的。
参考了网上的一些方法,找到两类解决方法,一类是通过随机种子入手,使每一次的随机种子不同,来保证不重复;第二类是使用一些数据结构和算法。
下面主要就第二类介绍几个方法:
方法1:
思想是用一个数组来保存索引号,先随机生成一个数组位置,然后把这个位置的索引号取出来,并把最后一个索引号复制到当前的数组位置,然后使随机数的上限减一,具体如:
先把这100个数放在一个数组内,每次随机取一个位置,将该位置的数用最后的数代替。
intindex=newint[15];for(inti=0;i
///产生一个非负数的乱数 /// publicstaticintNext {
(rb);
intvalue=(rb,0); if(value
///产生一个非负数且最大值在max以下的乱数 ///
///
publicstaticintNext(intmax) {
(rb);
intvalue=(rb,0); value=value%(max+1); if(value
///产生一个非负数且最小值在min以上最大值在max以下的乱数 ///
///
///
publicstaticintNext(intmin,intmax) {
intvalue=Next(max-min)+min; returnvalue; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- csharp 快速 连续 产生 相同 随机数 解决方案 总结