如何生成500M不重复的随机数

如何生成500M不重复的随机数,第1张

通常的生成随机数的做法是不考虑重复的,因为即使重复也属于概率意义上的正常情况。但某些情况下需要不重复的随机数据,怎么办呢
我想从大方向上来说,应该只有两个方法。要么牺牲时间要么牺牲空间。
下面均以在101~200的范围内(设为b[100],它实际上是附加空间),从中产生10个不重复的随机数(设为a[10])。
牺牲时间为代价
这种方法不需要附加空间b数组
要产生一定范围内不可重复的随机数,把曾经生成的随机数保存起来作为历史数据。产生一个新的随机数后在历史数据搜索,若找到就重新产生一个新的再重复数据搜索;否则就认为已经找到了一个新的不同随机数。
可以预见,每个新产生的随机数都要与前面所有的数比较。若重复,舍弃,再产生;否则,产生下一个。平均耗时n的平方量级。
粗看起来,上面的程序似乎没有什么问题,在执行过程中程序也能够通过。但,仔细分析我们就会发现问题出在一个新产生的随机数是否已经存在的判定上。既然是随机数,那么从数学的角度来说在概率上,每次产生的随机数 r就有可能相同,尽管这种可能性很小,但确是一个逻辑性与正确性的问题。因此,每次产生的新的随机数r都有可能是数组random的前i-1个数中的某一个,也就是说程序在运行过程中由此可能会导致死循环!
有人可能会争辩说,这种概率很小嘛,几乎为零。的确,但我要问,算法的五大特性是什么,其中两大特性就是:确定性和有穷性。
所以,怎么解决牺牲空间。
牺牲空间为代价
以下方法需要附加空间b数组。
将范围数组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],然后打乱顺序即可。
当范围数组与目标数组的大小非常接近时,上述算法非常有效,建议采用。
仍以最开始的那个例子来说,初始数组b[i]=100+i,a数组空。
每次随机生成数组b的一个下标subscript,然后取出它所对应的数据a[subscript],记下来。然后将数组b的最后一个数b[length]放到下标subscript的位置,同时将数组a长度减1。尽管前若干次生成的下标subscript随机数有可能相同,但,因为每一次都把最后一个数填到取出的位置,因此,相同下标subscript对应的数却绝不会相同,每一次取出的数都不会一样,这样,就保证了算法的确定性、有效性、有穷性。
以生成1-10之间的10个不重复的随机数为例,介绍生成不重复的随机数的一些方法。

作为一种语言进行统计分析,R有一个随机数生成各种统计分布功能的综合性图书馆。R语言可以针对不同的分布,生成该分布下的随机数。其中有许多常用的个分布可以直接调用。

在R中各种概率函数都有统一的形式,即一套统一的前缀+分布函数名:

d 表示密度函数(density)。

p 表示分布函数(生成相应分布的累积概率密度函数)。

q 表示分位数函数,能够返回特定分布的分位数(quantile)。

r 表示随机函数,生成特定分布的随机数(random)。

扩展资料:

注意事项:

1、使用了错误大小写:help()是正确的,其他都是错误的。

2、不要忘记使用必要的引号:installpackages(“gclus”)。

3、在函数调用时,不要忘记使用括号:help()。

4、在Windous上,路径名中使用的是\。

5、R拥有许多用于存储数据的对象类型,包括标量、向量、矩阵、数组、数据框和列表。数据框是用来存储数据集的主要数据结构。

参考资料来源:百度百科-R语言

参考资料来源:百度百科-标准正态分布

参考资料来源:百度百科-散点图

何选择一个随机数在R As a language for statistical analysis, R has a comprehensive library of functions for generating random numbers from various statistical distributions作为一种语言进行统计分析,R有一个随机数生成各种统计分布功能的综合性图书馆。 In this post, I want to focus on the simplest of questions: How do I generate a random number在这篇文章中,我想专注于简单的问题:我如何生成一个随机数?
The answer depends on what kin

一种偏斜-t分布的随机数生成方法及其Matlab实现然后,以GARCH模型为例,探讨了该随机数生成器的在参数估计中的表现极大似然估计的结果表明,各个系数的估计量均具有无偏性这也就是说,该随机数生成器可以有效地应用于时间序模型,如GARCH模型的模拟本研究的随机数生成器为基于蒙特卡罗技术,进一步讨论时间序列的偏斜特征如何影响模型参数估计的元偏性,效率性和渐近正态性等统计特性提供了基础

(1)画什么函数的图像?数据是什么?
(2)生成100个[0,
100]的随机数,并画出分布直方图
12x <- runif(100, 0, 100)hist(x)

C++与vb的道理是一样的,只是函数不同而已
在使用随机数函数之前,用这个函数可以初始化随机数种子,这样在以后用的时候就可以了:
srand(time(NULL));
rand( )函数是产生随机数的函数,但是没有srand()函数初始化种子,它产生的随机数叫“伪随机数”,每次运行都一样。

ox 和 Muller 在 1958 年给出了由均匀分布的随机变量生成正态分布的随机变量的算法。设 U1, U2 是区间 (0, 1) 上均匀分布的随机变量,且相互独立。令X1 = sqrt(-2log(U1))


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13323409.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-14
下一篇 2023-07-14

发表评论

登录后才能评论

评论列表(0条)

保存