如何让随机数等于javascript中的特定数字?

时间:2015-04-10 02:39:11

标签: javascript random numbers

好吧,我的问题是我有三个随机数生成器,我希望所有三个随机生成的数字(从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;
&#13;
&#13;

我已经尝试多次循环运行它,直到它是数字9,但没有一个工作。

5 个答案:

答案 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取决于r1r2,因此它被认为是随机的。

    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>&nbsp;</div>
<button>Get three numbers!</button>

答案 4 :(得分:-1)

这是一种方法。

&#13;
&#13;
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;
&#13;
&#13;