java中怎样在一个集合中随机取一个数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中怎样在一个集合中随机取一个数?相关的知识,希望对你有一定的参考价值。

比如我想在集合5,10,20,50中随机要一个数出来,请问怎样实现?
虽好直接上例子。
谢谢!

你可以获取ArrayList存储这组数据 然后以集合的长度作为随机数的上限,用Random对象的nextInt方法随机取ArrayList对象元素的索引值,利用ArrayList对象的get方法通过索引值获取你需要的数,这样就达到了随机取数的目的 参考技术A 以整数集合为例,随机选取数字的代码如下:
int [] arr = 1,2,3,4;
//产生0-(arr.length-1)的整数值,也是数组的索引
int index=(int)(Math.random()*arr.length);
int rand = arr[index];
参考技术B random r=new random();

int x=array[r.nextInt(3);]
先用随机数生成器生成一个数组长度范围内的随机数
,取得数组中我们得到的随机数的位置的数据就可以了
参考技术C 放入list集合(有序排列),然后random取随机数,把随机数当成下标取出list里的值本回答被提问者采纳 参考技术D Random的nextInt()方法
list.get(random.nextInt(3)) 随机不大于3的数

浅析 rand7生成rand10 方法 之 思想篇

【问题描写叙述】

rand7是一个能生成1-7的随机数。要求利用rand7生成1-10的随机数。

【算法思想】

1.组合数学方法
第1次 1 2 3 4 5 6 7 之中用rand7取一个数
第2次从 2 3 4 5 6 7 8 之中取一个数
第3次从 3 4 5 6 7 8 9 之中取一个数
第4次从 4 5 6 7 8 9 10 之中取一个数
第5次从 5 6 7 8 9 10 1 之中取一个数
第6次从 6 7 8 9 10 1 2 之中取一个数
...
第10次从 10 1 2 3 4 5 6 之中用取一个数
1-10每一个数字在上表中都出现了7次。共同拥有70个数字,这样每一个数字被命中的概率为1/10。
这里的关键词是"命中".
第11次又一次循环,从 1 2 3 4 5 6 7 之中取一个数
第12次从 2 3 4 5 6 7 8 之中取一个数
......
依照这种方法。1-10每一个数字被命中的概率是均匀分布。而1-10次的数组,本质上是生成了全部1-10依照次序的一个轮换结构。也就是组合问题中的生成全部排列。(參见Knuth第4卷第2冊(The Art Of Computer Programming, Volume4, Generating All Tuples and Permutations))在经过比較长的时间之后,就能够观察到均匀分布。其实,不论什么随机数算法都须要经过比較长的过程才干观察出他的分布。而概率分布。是在一个统计意义上的概念。
由此还能够得出用m个随机数生成n个随机数的方法
1. 当m > n的时候,用舍去法,每次n个随机数,超过这个范围就舍弃,再来一次。
2. 当m < n的时候,用如上的方法建立m大小的数组,当中的数字在1到n依照次序循环轮换,这样n*m个循环之后。就能够得到均匀的n个随机数。



2. 同余循环法
上面这种方法。实际上等价于(rand7() + i)%10。i从0-9重复循环。而每次计算的余数恰好与上面的方法等价。也就是用利用同余的性质生成全部排列。这真是一个巧妙的想法!

于是:

1. i从0到9重复循环
2. (rand7()+i)%10,产生0-9的随机数。等效与第一种组合法(仅仅须要把上面表中的1-10改成0-9)
3. 再+1得到1-10的随机数
优化后仅仅须要一行代码!


于是上面用m个随机数生成n个随机数的方法的,也有了更简洁的算法,步骤与此相似就不写了。


3. 舍去法

这个题在考试中大概是不让用舍去法的,由于他太平庸。

但实际上舍入法也非常实用。因此还是写出来,后面还会再提到舍入法。


1. 第一次用rand7取出1到5的随机数,记为a
2. 第二次用rand7取出1或2,记为b
3. 假设b = 1, 则c = a, 假设b = 2,则c = a + b
4. 返回c

4. . 连续随机变量的分布
本题的rand7是一个离散随机变量,仅仅取1-7的整数。

离散变量的缺点是在数学计算上不方便,因此能够转成连续随机变量。也就是从rand7生成1-7的连续均匀分布,获得1-10的均匀分布。尽管本题不适用这种方法,可是本题除了考试实用,在实际应用中不会出现,很多其它的方法是从一种分布变换到第二种分布。


如今的答案非常easy。从几何的角度上看,我们能够把[a,b]线段上的点依照一对一映射到还有一个线段[c,d]上去,仅仅须要做一个线性变换y=(x-a)/(b-a)*(d-c)+c. 那么。若rand()~U(a,b),则y=(rand()-a)/(b-a)*(d-c)+c~U(c,d)。也就是假设rand()是a到b上的均匀分布,则y=(d-c)(x-a)/(b-a)+c是c到d上的均匀分布。

对于本例rand10=(rand()-1)/6*9+1.?
这个定理还能够更强一些,f(x)是分段还是也能够。甚至仅仅是一个覆盖(包含)就能够了。从符合一种分布的随机数生成第二种分布的随机数是统计模拟的课题,当中有非常有趣的变换方法,比如,假设X是(0,1)上的均匀分布,则Y=-a*log(X)是指数分布。这些内容,參考《统计判断》,或者更进一步的材料。



5. 再谈舍入法
C语言的rand函数,可能是用了线性同余算法获得均匀分布,这类叫直接方法。舍去法也是非常重要的一类随机,用来生成各种分布的随机数,比方Metropolis算法。比較著名的还有Markov Chain Monte Carlo (MCMC)算法。这类方法能够看成是一个黑盒子。要求在算法内部通过几次运算非常快收敛到一种概率分布,然后返回一个随机数。參见Casella & Berger统计判断(Statistical Inference)以及Kunth第2卷Seminumerical Algorithms, Random Numbers.


以上是关于java中怎样在一个集合中随机取一个数?的主要内容,如果未能解决你的问题,请参考以下文章

java 16 -14 建立产生不重复的限定个数的随机数集合

java怎样将集合中的数值数据分区间统计个数:例如(0-1000)有几个人数据,1000-2000有几个数据

Codeforces Round #580 (Div. 2)

Java中Set 和List两个集合怎样互相转化

python-random随机数

Java中Set 和List两个集合怎样互相转化