我要1〜4,4包括的范围内产生随机数。
这里是我的代码:
int num = r.nextInt(4) + 1; //r is instance of Random.
不过,我运行在一个循环上面的代码,不希望重复的随机数。 现在会发生什么往往是我得到:
1,1,1,2,3,1,4,2,2,1,4,2,4,4,2,1,4,3,3,1,4,2,4,1
作为我的输出。
这里,尽管数字的范围(1-4)内随机的,但经常重复像在第一3次迭代次数“1”。
我所寻找的是一个方法的循环中得到非重复的随机数。 我知道一个简单的方法是保持当前迭代和比较之前的最后一个随机数,但我相信一定有更好的解决办法了这一点。
提前致谢。
使用random.nextInt(range-1)
然后将该号码映射到与排除先前的数的函数的输出数:
public class Test {
private final Random random = new Random();
private final int range;
private int previous;
Test(int range) { this.range = range; }
int nextRnd() {
if (previous == 0) return previous = random.nextInt(range) + 1;
final int rnd = random.nextInt(range-1) + 1;
return previous = (rnd < previous? rnd : rnd + 1);
}
public static void main(String[] args) {
final Test t = new Test(4);
for (int i = 0; i < 100; i++) System.out.println(t.nextRnd());
}
}
没有“好”的答案。 你得到一个随机数。 检查这一行:
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
这可能是完全随机的。 所以,我建议你描述一个更好的要求。 你想永远是下一个数字,是从以前的有什么不同? 你想在一个特殊的响了最大重复的? 让内连续6号说,每个数字被允许出现两次?
如果你把这样的要求,我们也许能够帮助你。 否则,我们只能说:你看到什么是真正随机的:)
当你有更多的数字比你要选择的,你必须重复一些数字。 所有你能做的就是尽量减少直接重复次数。
这样做的一个方法是使用Collections.shuffle,让你可以有一个数字以随机的顺序,无需重复做这个每次。 你可以防止被重复过去的N值。
要停止重复数可以减少范围和使用模量。
int n = 0, max = 4;
Random rand = new Random();
for(int i = 0; i < numbers; i++) {
n = (n + rand.nextInt(max-1)) % max;
int numToUse = n + 1;
// use this number.
}
这项工作,因为真的只有max-1
可能的值作为你排除使用最后一个值。
这里是一个算法:
initialize an array A[4] with the numbers 1-4
set a counter Acnt, the effective size of A. Initialize to 4
for i in 1 to length(output sequence)
choose a random integer X from 0 to Acnt -1
save A[X] to your output sequence
swap(A[X],A[Acnt - 1])
Acnt--
if(Acnt == 0) Acnt = lengh(A)
想象一下,一个是球与数字1-4袋。 您的每次循环,你删除一个球。 而不是从阵列,这是expenisve实际删除,您只需隐藏在数组的末尾球。 当你在递减袋(ACNT)球的数量,选择下一个球来自于非隐藏球。
当你有没有更多的球来选择,你在你的包复位球的计数回满计数取消隐藏球。
这基本上是标准的洗牌算法。
编辑:重读的问题,我现在看到他允许重复后,只有1号,而不是整个序列,在这种情况下,所有你需要做的修改,这是变化的,如果(ACNT == 0)到如果(ACNT ==长度(A) - 1)。