【发布时间】:2013-10-02 00:02:37
【问题描述】:
如何使用Math.random() 生成以二为单位上升的随机数?比如我想从集合(2,4,6,8)中生成一个随机数,你会怎么做呢?
【问题讨论】:
-
那么,您的意思不是“生成”一个随机数吗?您只想从数字数组中选择一个随机索引?
如何使用Math.random() 生成以二为单位上升的随机数?比如我想从集合(2,4,6,8)中生成一个随机数,你会怎么做呢?
【问题讨论】:
对于这个特定的集合,你可以使用
(int)(Math.random() * 4) * 2 + 2
这里:
Math.random() 生成一个大于或等于 0.0 且严格小于 1.0 的数字;(int)(... * 4) 给出 0、1、2、3 之一。... * 2 + 2 给出 2、4、6、8 之一。【讨论】:
好的,我们来做一个真正的通用解决方案。
int lower = 2;
int upper = 8;
int step = 2;
int rand = (int)(Math.random() * (upper-lower+1));
int result = rand - rand%step + lower;
如果您想在您指定的集合之外的另一个集合中生成数字,只需更改 lower、upper 和 step 变量以适合您的集合。如果它在集合中,它包括上限。
【讨论】:
(几乎)完全通用的方法并不难。
static randInt(int first, int last, int step) {
int nsteps = (last+1-first) / step;
return first + step*(int)(nsteps*Math.random());
}
如果stop 不是序列的一部分,则返回从{start, start+step, start+2*step, ... } 到stop 的随机整数,或者stop 之前的最后一个数字。
int choice = randInt(2, 8, 2); /* random choice from {2, 4, 6, 8} */
...解决了示例问题。
(几乎)部分是它不处理参数中的整数溢出或符号错误(step 为零,step<0 当first<last 时,反之亦然。)
【讨论】:
int[] numSet={2,4,6,8};
Random myRand=new Random();
int myNum=numSet[myRand.nextInt(numSet.length)];
这会创建一个数字数组,即随机对象,然后从数字数组中选择一个随机元素。这并不假定这些数字属于任何类型的数学系列。就此而言,它们可能是 11、25、31、876、984368、7432、84562。
请不要告诉我有一个多项式可以从它的 y 值生成该集合。我知道。
【讨论】:
将这些数字放入一个数组中。 使用数组的长度 - 1 生成一个随机数,并将其作为索引来随机选择一个数组元素。
【讨论】:
你也可以像这样使用 java.util.Random 类:
int values[] = {2,4,6,8};
Random randomGenerator = new Random();
int randomInt = randomGenerator.nextInt(values.length);
int randomValue = values[randomInt]; /* Here's your random value from your set */
【讨论】:
我想添加一个更笼统的答案。
假设集合中最小的整数是A,集合的大小是S。集合中的随机整数会是这样的:
A + myRandom.nextInt(S) * 2
对于您在 Java 中的具体示例,它将是:
Random myRandom = new Random();
int randomNum = 2 + myRandom.nextInt(4) * 2;
【讨论】: