好吧,我的问题是我有三个随机数生成器,我希望所有三个随机生成的数字(从1-5生成)的值加起来为9.例如,我随机生成一个4,a 3和a 2.再次点击按钮,一个5,一个3和一个1.我已经尝试了一段时间来做这个,但是无法弄明白。
function statGen() {
var x = document.getElementById("number");
x.innerHTML = Math.floor((Math.random() * 5) + 1);
var a = document.getElementById("agl");
a.innerHTML = Math.floor((Math.random() * 4) + 1);
var l = document.getElementById("lck");
l.innerHTML = Math.floor((Math.random() * 3) + 1);
}

<button id="statbutton" onclick="statGen()">Get Numbers</button>
<p id="main">Main:</p>
<p id="number"></p>
<br/>
<p id="Agl">Agl:</p>
<p id="agl"></p>
<br/>
<p id="Lck">Lck:</p>
<p id="lck"></p>
&#13;
我已经尝试多次循环运行它,直到它是数字9,但没有一个工作。
答案 0 :(得分:1)
到目前为止,所有答案都没有良好的随机性。通过选择第一个数字,然后是第二个数字,然后选择第三个数字,你会对极端情况产生很大的偏见。
让我用骰子示例说明。假设你要掷三个骰子,它们加起来为8个。如果你一次掷出一个骰子,那么你最终得到的排列有1/6的几率是[6,1,1]。这是因为在您滚动6(概率为1/6)后,唯一可接受的剩余数字是1和1.
实际上,[6,1,1]不是所有可接受的卷的近1/6。例如,从3开始给出[3,1,4],[3,2,3],[3,3,2],[3,4,1]。因此,将第3个作为第一个数字应该是具有6的可能性的4倍。但是,这些其他方法的情况并非如此!
所以有几种方法可以获得好的&#34;随机性。最简单的实际上就是滚动所有三个&#34;骰子&#34;,如果结果不符合您的约束,请再次滚动它们。
function roll() {
return Math.floor(Math.random() * 5 + 1); //1-5 uniformly
}
function chooseNumbers() {
var x = 0, y = 0, z = 0;
while (x + y + z !== 9) {
x = roll();
y = roll();
z = roll();
}
return [x, y, z];
}
对于大多数用途来说这将是非常快的,但你最终会丢掉相当数量的卷。另一种选择是枚举(使用代码或手动)您可以拥有的所有排列,然后使用统一的随机数选择索引。
var permutations = [
[5, 3, 1],
[5, 2, 2],
[5, 1, 3],
[4, 4, 1],
//...
[1, 3, 5]
];
function chooseNumbers() {
return permutations[Math.floor(Math.random() * permutations.length)];
}
答案 1 :(得分:0)
最后一个随机数r3
取决于r1
和r2
,因此它被认为是随机的。
function statGen() {
var x = document.getElementById("number");
var r1=Math.floor((Math.random() * 9) + 1);
var r2=Math.floor((Math.random() * (8-r1)) + 1);
var r3=9-r1-r2;
x.innerHTML = r1;
var a = document.getElementById("agl");
a.innerHTML = r2;
var l = document.getElementById("lck");
l.innerHTML = r3;
}
答案 2 :(得分:0)
这样的东西? (这是伪代码):
var first = Math.floor((Math.random() * 5) + 1);
var second = Math.floor((Math.random() * 8-first) + 1);
var third = Math.floor((Math.random() * 9 - (first+second);
如果您需要保证3个号码,前两个的总和应该是8或更少,除非您接受0作为第3个可能的号码。
答案 3 :(得分:0)
Mark Peters在他的回答中概述了two methods。第一种方法是一种强力方法:生成三个随机数的组,直到找到一个总和为9的随机数。第二种方法是将所有28种可能的排列制成表格,然后随机选择一种。
第一种方法可能更慢,第二种方法会消耗更多内存。只要您只需要执行一次,并且所需的三个数字的总和很小(如9),那么您使用的数字并没有多大区别。
但是,如果所需的金额很大,您可能需要采用不同的方法。假设,所需金额为100万。蛮力方法可能很慢。列表所有排列可能会消耗太多内存(或磁盘空间,具体取决于实现)。
排列总数是整数1
与最大可能值之和。可以使用Mathematics Stack Exchange中的等式快速计算该总和:
取第一个数字和最后一个数字的平均值,然后乘以数字数。
因此,在这种情况下,排列总数几乎为1,000,000 x 500,000
;关于500,000,000,000
排列。
因此,我们可以生成一个随机数n
而不是计算所有可能的排列,而只计算给定所需总和的第n个排列:
function getPermutation( n, requiredSum) {
var remainder = n;
var step = requiredSum - 2;
var firstNumber = 1;
while(remainder > step){
firstNumber++;
remainder -= step;
step--;
}
var secondNumber = remainder;
var thirdNumber = requiredSum - firstNumber - secondNumber;
return [ firstNumber, secondNumber, thirdNumber ];
}
此处示例:
$(document).ready( function(){
$("button").click( function() {
$("div").text( JSON.stringify( get3Numbers(1000000) ) );
});
});
function get3Numbers(requiredSum){
var maximum = requiredSum - 2;
var permutations = maximum * ( (maximum + 1.0) / 2.0);
var randomNumber = Math.floor((Math.random() * permutations) + 1);
var threeNumbers = getPermutation(randomNumber, requiredSum);
var sumOfNumbers = threeNumbers[0] + threeNumbers[1] + threeNumbers[2];
return {
threeNumbers: threeNumbers,
total: sumOfNumbers
};
}
function getPermutation( n, requiredSum) {
var remainder = n;
var step = requiredSum - 2;
var firstNumber = 1;
while(remainder > step){
firstNumber++;
remainder -= step;
step--;
}
var secondNumber = remainder;
var thirdNumber = requiredSum - firstNumber - secondNumber;
return [ firstNumber, secondNumber, thirdNumber ];
}
div {
border: 1px solid silver;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div> </div>
<button>Get three numbers!</button>
答案 4 :(得分:-1)
这是一种方法。
function statGen() {
var x = document.getElementById("number");
var firstNumber = Math.floor((Math.random() * 5) + 1);
x.innerHTML = firstNumber;
var a = document.getElementById("agl");
if (firstNumber == 5) {
var secondNumber = Math.floor((Math.random() * 4) + 1);
} else {
var secondNumber = Math.floor((Math.random() * 5) + 1);
}
a.innerHTML = secondNumber;
var l = document.getElementById("lck");
l.innerHTML = 9-(firstNumber + secondNumber);
}
&#13;
<button id="statbutton" onclick="statGen()">Get Numbers</button>
<p id="main">Main:</p>
<p id="number"></p>
<br/>
<p id="Agl">Agl:</p>
<p id="agl"></p>
<br/>
<p id="Lck">Lck:</p>
<p id="lck"></p>
&#13;