【发布时间】:2014-10-28 14:32:54
【问题描述】:
我正在做一些编码练习,但遇到了这个问题:
从 5 个骰子(6 面)掷骰中,生成一个范围为 [1 - 100] 的随机数。
我实现了以下方法,但是返回的数字不是随机的(调用函数1,000,000次,有几个数字从未出现在1 - 100中)。
public static int generator() {
Random rand = new Random();
int dices = 0;
for(int i = 0; i < 5; i++) {
dices += rand.nextInt(6) + 1;
}
int originalStart = 5;
int originalEnd = 30;
int newStart = 1;
int newEnd = 100;
double scale = (double) (newEnd - newStart) / (originalEnd - originalStart);
return (int) (newStart + ((dices - originalStart) * scale));
}
【问题讨论】:
-
不要每次都创建
Random的新实例,为每个方法调用维护一个实例。虽然您可能仍然会“丢失”数字,但范围会更加随机。 -
只使用第一个骰子。它将返回一个 1-100 之间的随机数。那或者请澄清你的问题。
-
他需要模拟掷骰子。你最后一次看到有 99 个面的骰子是什么时候?
-
我以前见过一个有 100 个面的骰子。
-
@Slavic 不幸的是,他们存在