我试图产生0到100之间的四个随机数,它们将等于100.
我设法产生了结果,但效率并不高。我的方法只是在0到100之间循环随机数,然后加上它们,如果它不等于100然后重复该过程直到它等于100.是否有更有效的方法?
提前致谢
答案 0 :(得分:6)
您可以生成介于1和(100-3)之间的第一个随机数。假设您的第一个随机数是X.您生成的下一个随机数应该在X和(100-2)之间。假设该数字是Y.下一个随机数应该在(X + Y)和(100-1)之间。假设该数字为Z。
现在你有了第四个随机数,即100-X-Y-Z。仔细检查其中一些,以表明它与您当前的数字生成器具有相同的分布,以检查您的工作。
答案 1 :(得分:5)
随机抽取0到100之间的3个数字而不重复。现在将它们按升序排序并将后续数字之间的间隙解释为您首先绘制的数字。使用3个分隔线时,您想要绘制的4个数字有4个间隙。
使用此方法,您可以多次使用相同的数字,如果可以的话。
答案 2 :(得分:3)
你可以这样做:
Random r = new Random();
int n1 = r.nextInt(100);
int n2 = r.nextInt(100 - n1);
int n3 = r.nextInt(100 - n1 - n2);
int n4 = 100 - n1 - n2 - n3;
答案 3 :(得分:2)
这似乎很有效:
Random random = new Random();
public int[] fourRandoms(int limit) {
int[] randoms = new int[4];
int[] three = new int[3];
for (int i = 0; i < 3; i++) {
three[i] = random.nextInt(limit);
}
int min = Math.min(three[0], Math.min(three[1], three[2]));
int max = Math.max(three[0], Math.max(three[1], three[2]));
int mid = three[0] + three[1] + three[2] - max - min;
randoms[0] = min - 0;
randoms[1] = mid - min;
randoms[2] = max - mid;
randoms[3] = limit - max;
return randoms;
}
public void test() {
for (int i = 1; i < 10; i++) {
int[] randoms = fourRandoms(100);
int sum = Arrays.stream(randoms).sum();
System.out.println(Arrays.toString(randoms) + " = " + sum);
}
}
它是@ SpaceTrucker idea的实现。
或者 - 使用Java 8 Streams。
public int[] nRandomsThatSumToLimit(int n, int limit) {
return IntStream
.concat(
// Stream n-1 random ints and sort them.
random.ints(n - 1, 0, limit).sorted(),
// Plus the final limit value.
IntStream.of(limit))
// Convert into a stream of differences.
.map(new IntUnaryOperator() {
// Maintain the previous.
int p = 0;
@Override
public int applyAsInt(int n) {
// Difference.
int d = n - p;
// Persist.
p = n;
return d;
}
}).toArray();
}
答案 4 :(得分:0)
生成0到100之间的4个随机数
将四个数字相加
将四个生成的数字中的每一个除以s / 100(四舍五入)
你的金额现在是99,100,101
如果需要检查调整是否低于0或高于100