如何在javascript中获得与特定数字相等的随机数
How to get random numbers to equal a specific number in javascript?
好吧,我的问题是我有三个随机数生成器,我希望所有三个随机生成的数字(从1-5生成)的值加起来为9。例如,我随机生成一个4、一个3和一个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>
我试过多次在循环中运行它,直到它变成数字9,但都不起作用。
到目前为止,所有的答案都没有很好的随机性。通过选择第一个数字,然后选择第二个数字,再选择第三个数字,你会有很大的极端倾向。
让我举一个骰子的例子来说明。假设你想掷三个骰子,它们加起来是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。因此,将3作为第一个数字的可能性应该是6的四倍。但其他方法并非如此!
因此,有几种方法可以获得"良好"的随机性。最简单的方法实际上是将三个"骰子"全部掷下,如果结果不符合您的限制,则再次掷下。
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)];
}
最后一个随机数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;
}
Mark Peters在他的回答中概述了两种方法。第一种方法是一种蛮力方法:生成三个随机数的组,直到找到一个和为9的随机数。第二种方法是将所有28种可能的排列形式制成表格,然后随机选择一种。
第一种方法可能较慢,第二种方法将消耗更多内存。只要您只需要执行一次,并且所需的三个数字之和很小(如9),那么您使用哪一个数字没有太大区别。
但是,如果所需的金额很大,您可能需要一种不同的方法。假设所需金额为100万。暴力手段可能相当缓慢。对的所有排列进行制表可能会消耗太多内存(或磁盘空间,具体取决于实现)。
排列的总数是整数1
到最大可能值的总和。使用数学堆栈交换:中的公式可以快速计算出这个总和
取第一个数字和最后一个数字的平均值,然后乘以数字的数量。
因此,在这种情况下,排列的总数几乎是1,000,000 x 500,000
;关于CCD_ 6排列。
因此,我们可以生成一个随机数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>
类似的东西?(这是伪代码):
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个数字,除非您接受0作为第三个可能的数字,否则前两个数字的总和应小于或等于8。
这里有一种方法。
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);
}
<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>
- 如何在javascript中获得与特定数字相等的随机数
- 在数组中生成随机数,没有任何重复的数字
- 如何在javascript中生成任意四个数字之间的随机数
- 如何从生成随机数的数组中确定最高和最低数字;JavaScript
- 需要用户输入一个随机数,然后提醒用户数字 ibnputted
- 创建使用用户输入的数字范围生成的随机数.(JavaScript)
- Javascript - 在一定范围内生成随机数,不包括某些数字
- 使用while循环打印随机数,直到达到某个数字
- 如何在1到9999之间创建100个4位数的随机数,并将数字排成10行,每行10个数字
- 如何取一个现有的数字,并在此基础上生成一个随机数?[javascript]
- 如何在javascript中返回一个随机数,它总是大于前一个数字
- 使用Java脚本在数字表中30次更改2个随机数
- 随机数,它不等于前一个数字
- 如何得到一个双随机数,并把它的数字变量
- 函数,该函数接受两个数字并返回两个数字之间的随机数.(JavaScript)
- 不重复前一个数字的数学随机数
- 使用Javascript获得2个数字之间的随机数,但具有特定范围的可能性较小
- 如何将随机数添加到结果处的存储变量中,作为一个数字,而不是两个字符串加在一起
- Javascript:记录偶数和奇数随机数的计数,并得到每个数字的总和
- 生成2个数字之间的随机数