• 回答数

    4

  • 浏览数

    330

赤脚医师
首页 > 期刊论文 > 随机数的产生方法毕业论文

4个回答 默认排序
  • 默认排序
  • 按时间排序

尛尛尛舒

已采纳

所谓真正的随机数必须位数要够大,比如限定100以内的自然数,那么限定本身就不够随机;其次,任意生物属性及行为在精确到足够位数都具有对应程度的随机性,多项属性的随机排列穿插组合随机性就达到惊人的位数;最后,要在短时间内产生足够的随机数,机器采样和计算就有速度要求,多台机器对多人或动物的采样提供给一台机器做最后的分解可以提高效率。

265 评论

追风的夕夕

函数是这样用,比如100至999的随机数

不过这样会有重复,可以给Random一个系统时间做为参数,以此产生随机数,就不会重复了

第一种方法不指定随机种子,系统自动选取当前时前作随机种子:

Random ra=new Random();

第二种方法是指定一个int型的参数作为随机种子:

int iSeed=6;Random ra=new Random(iSeed);

下面我们要用到Random.Next()方法产生随机数。

ra.Next();

它返回一个大于或等于零而小于2,147,483,647的数,这并不满足我们的需要,下面我们介绍它的重载函数和其它一些方法。

public virtual int Next(int);

用法:ra.next(20)返回一个小于所指定最大值(此处为20)的正随机数。

public virtual int Next(int minValue, int maxValue);

用法:ra.next(1,20)返回一个指定范围内(此处为1-20之间)的随机数,我们在下面的实例中会用到此函数。

类System.Random还有几个方法分别是:公共方法:NextBytes用随机数填充指定字节数组的元素。NextDouble返回一个介于 0.0 和 1.0 之间的随机数。

受保护的方法:Sample返回一个介于 0.0 和 1.0 之间的随机数,只允许子类对象访问。

105 评论

为爱浪漫1

要生成多个 循环来比 的话6个都循环比一边 如果有与之前重复的重新生成 再执行 循环 对比 这样写不太好啊 而且 再执行的循环 可以放在一个函数里调用但是 如果还是重复 再函数在自己调用自己 这样写不行吧有什么办法没有 。。。 希望能给个简单的例子我底子比较薄

84 评论

始终不遇

如何产生不重复的随机数?最容易想到的方法,是逐个产生这些随机数,每产生一个,都跟前面的随机 数比较,如果重复,就重新产生。这是个很笨的方法,且比较次数呈线性增长,越往后次数越多。其实这些 比较是多余的,完全可以不进行比较,只要反过来,按顺序产生这些数,但随机产生它们的位置。例如下 面产生100 个100 以内不重复随机数的代码: int a[100]; for(i=0;i=99;++i)a[i]=i; for(i=99;i=1;--i)swap(a[i],a[rand()%i]); 上面这段代码只需要遍历一次就可以产生这100 个不重复的随机数,它是如何做到的呢?首先第二行按顺 序用0 到99 填满整个数组;第三行,是随机产生从0 到m-2 个数组下标,把这个下标的元素值跟m-1 下标的元 素值交换,一直进行到下标为1 的元素。因此它只需要遍历一次就能产生全部的随机数。 再看下面的代码,原理跟上面例子相似,但效率比上面的差点,但仍不失为一个好方法: int a[100]={0}; int i,m; for(i=1;i=99;++i) { while(a[m=rand()0]); a[m]=i; } 这段代码也是随机产生位置,但它预先把整个数组初始化为0,然后随机产生其中一个位置,如果该元素 值为0,表示这个位置还没有被使用过,就把i 赋予它;否则,就重新随机产生另一个位置,直到整个数组 被填满。这个方法,越到后面,遇到已使用过的元素的可能性越高,重复次数就越多,这是不及第一个方 法的地方,但总的来说,效率还是不错的。 === 1.产生一个随机数(从0 到32767) srand((unsigned)time(NULL));//为了提高不重复的概率 rand();//产生随机数 2.产生从m 到n 的随机数(包括m,不包括n) srand((unsigned)time(NULL));//为了提高不重复的概率 rand()%(n-m+1)+m;//使用时将m 和n 换为具体数即可 == 问题的来由-"随机取m 个数(在1 到n 的范围之内),(m=n),要求m 个数没有重复。有没有 什么好的算法,时间复杂度和空间复杂度都很好" -- 方案一: 取随机数可以用C++标准的rand,至于M 个不重复,你可以用std:set 来解决,把取道的随机数 插入到set 里面,set 的size()==m 就可以了,具体可以这样: #include set #include stdlib.h int main() { std:set int s; while(1) { int r=rand()%n; s.insert(r); if(s.size()==m) { break; } } } 由于set 底层实现是红黑树,插入复杂度是对数级的^_^ -- 方案二: #include iostream #include cstdlib//用于rand()和srand()函数 #include ctime//设置不同的随机数 using namespace std; int main(){ srand(time(0));//调用不重复的随机数函数 unsigned i; for(int n=0;n++10;) { i=rand();//对i 赋系统的随机数 cout"The NO."n"is:"i endl; } return 0; } 1.C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX 之间均匀分布的伪随机整数。RAND_MAX 必须至少为 32767。rand()函数不接受参数,默认以 1 为种子(即起始值)。 随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同。失去了随机意义。 2.C++中另一函数srand(),可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪 随机数列也相同。-一个办法是让用户输入种子,但是仍然不理想。 3.比较理想的是用变化的数,比如时间来作为随机数生成器的种子。 在头文件ctime 中时间库包含time 函数,它可以返回一个表示时间、日期、月和年的数值使用如 下调用可将该值设为rand 的种子 srand(static_cast unsigned(time(static_cast time_t*(NULL)))); 4.但,srand()并不是说使随机数都不一样,它只是使取随机数的种子随着时间而改变:) So,还是方案一好! === 生成无重复的随机数,注意,是不重复的序列. 通常的生成随机数的做法是不考虑重复的,因为即使重复也属于概率意义上的正常情况.但某些情况下需要不重复的随机数据,怎么办呢? 我想从大方向上来说,应该只有两个方法.要么牺牲时间要么牺牲空间.讲得不对或不完整,大家一定要指出来啊,谢谢. =---来源CSDN 注意,下面均以在101~200 的范围内(设为b[100],它实际上是附加空间), 从中产生10 个不重复的随机数(设为a[10]). 一.牺牲时间为代价 这种方法不需要附加空间b 数组. 要产生一定范围内不可重复的随机数,把曾经生成的随机数保存起来作为历史数据。产生一个新的随机数后在历史数据搜索,若找到就重新产生一个新的再重复数据搜索;否则就认为已经找到了一个新的不同随机数。 可以预见,每个新产生的随机数都要与前面所有的数比较.若重复,舍弃,再产生;否则,产生下一个.平均耗时n 的平方量级. 粗看起来,上面的程序似乎没有什么问题,在执行过程中程序也能够通过。但,仔细分析我们就会发现问题出在一个新产生的随机数是否已经存在的判定上。既然是随机数,那么从数学的角度来说在概率上,每次产生的随机数r 就有可能相同,尽管这种可能性很小,但确是一个逻辑性与正确性的问题。因此,每次产生的新的随机数r 都有可能是数组random 的前i-1 个数中的某一个,也就是说程序在运行过程中由此可能会导致死循环! 有人可能会争辩说,这种概率很小嘛,几乎为零.的确,但我要问,算法的五大特性是什么,其中两大特性就是:确定性和有穷性. 所以,怎么解决?牺牲空间.(稍后介绍) 二.牺牲空间为代价 以下方法需要附加空间b 数组. (1)将范围数组b[100](b[i]=100+i,不妨设数组下标从1 开始)的每个元素设置一个标志位flag.初始均为flag=0;若某元素被选入到a 数组中,则 flag=1;显然,以后再选到重复元素可以立刻判定是否已选.这不正是以空间换时间吗? 但是仍然有一个很严重的问题,在小规模输入下,无疑它的表现是不错的.但现在举一个失败的例子. 在1~65536 之间,选择65500 个不重复的随机数.看看后面的随机数,比如第 65500 个数(最后一个),它要在剩下的36 个数中选择才会有flag=0(根本不知道这36 个数是什么);哼哼,概率36/65536.越到后面,随机数越难产生,空间也换不了时间. 改进:先在1~65536 之间随机选取36 个数,删除.将剩下的65500 个数依次赋值给a[65500],然后打乱顺序即可,如下伪码: 1fori←1to length[a] 2doj←random()//随机产生一个a 数组的下标 3 exchange a[i]←→a[j]//交换a[i]与a[j] 4 当范围数组与目标数组的大小非常接近时,上述算法非常有效,建议采用. (2)问题的最终解决. 仍以最开始的那个例子来说,初始数组b[i]=100+i,a 数组空. 每次随机生成数组b 的一个下标subscript,然后取出它所对应的数据 a[subscript],记下来.然后将数组b 的最后一个数b[length]放到下标 subscript 的位置,同时将数组a 长度减1。

341 评论

相关问答

  • 次氯酸钠的生产方法文献论文

    次氯酸钠的生产工艺流程次氯酸钠是由烧碱与氯气反应而得的。次氯酸钠溶液的生产有间歇法和连续法两种。下面主要介绍连续法生产的工艺过程。在碱液循环槽内配制12%~15

    飞翔的等待 5人参与回答 2023-12-06
  • 生产成本论文研究方法

    从成本控制的主要内容和存在的问题,产品成本控制的策略方面进行论述。论文格式的论文题目。要求准确、简练、醒目、新颖。论文格式的内容提要。是文章主要内容的摘录,要求

    雪莉小姐的 2人参与回答 2023-12-11
  • 随机信号毕业论文

    摘 要随着我国经济的高速发展,微电子技术、计算机技术和自动控制技术也得到了迅速发展,交流变频调速技术已经进入一个崭新的时代,其应用越来越广。而电梯作为现代高层

    小阿殷- 3人参与回答 2023-12-11
  • 毕业论文凑字数的方法

    从别处复制大段的文字粘贴过来就可以了。或者手打几个字,复制,然后不断的粘贴。

    糊涂妞呀 5人参与回答 2023-12-09
  • 毕业论文经济法的产生

    经济法产生的背景主要有以下几个方面:1. 工业化和市场化进程的加速:随着工业化和市场化进程的加速,经济活动呈现出了日益复杂和多样化的趋势,政府需要出台相关法规来

    *和氣生財*** 2人参与回答 2023-12-10