带递归的随机数JavaScript

带递归的随机数JavaScript,javascript,math,random,for-loop,Javascript,Math,Random,For Loop,我试图创建一个javascript函数,它接受两个参数min和max,并在两个整数之间生成一个随机数。那部分很简单 让事情变得棘手的是,我需要创建一个条件 function generateNum (min, max) { var randNumber = Math.ceil(Math.random()*(max - min)+min); if (randNumber === max) { // store the result (probably in an array) a

我试图创建一个javascript函数,它接受两个参数
min
max
,并在两个整数之间生成一个随机数。那部分很简单

让事情变得棘手的是,我需要创建一个条件

function generateNum (min, max) {
  var randNumber = Math.ceil(Math.random()*(max - min)+min);

  if (randNumber === max) {
    // store the result (probably in an array) and generate a new 
    // number with the same behavior as randNumber (e.g. it is also
    // stores it's total in the array and recursively "re-generates 
    // a new number until max is not hit)
  }
}
其思想是递归ise,以便存储、合并并返回最大命中数的运行总数

例如:脚本接收的最小/最大参数为5/10
generateNum(5,10){}
。如果由
randNumber
生成的值为5、6、7、8或9,则不存在递归,函数将返回该值。如果由
randNumber
生成的值为
10
,则值
10
存储在数组中,函数现在递归地“重试”(即生成10次,然后该值存储为数组中的附加对象,函数重试)。当过程停止时(可能是无限的,但每次递归重复的概率呈抛物线递减)。最后的数字(5、6、7、8、9)将添加到生成的
max
值的总数中,并返回结果


这是一个非常不寻常的数学场景,请告诉我如何澄清这是否有意义。

我假设您并不真正需要递归解决方案,因为您将此
标记为循环。这将返回拾取最大数量的次数:

function generateNum (min, max) {
    var diff = max - min;
    if(diff <= 0)
        return;

    for(var i = 0; diff == Math.floor(Math.random()*(diff + 1)); i++);

    return i;
}
递归方法:

function generateNum (min, max) {
  var res = Math.floor(Math.random() * (max - min + 1)) + min;

  return (res === max) ? [res].concat(generateNum(min, max)) : res;
}
两件事:

1) 滚动10次的概率保持不变(理论上每次滚动(重试)的概率相同),低概率是连续命中n次10次

2) 我不明白为什么需要递归,那么while循环呢

 var randNumber;
 var arr = [];
 while ((randNumber = Math.ceil(Math.random()*(max - min)+min)) === max) {
   arr.push(
 }
那部分很简单

不像你想的那么容易。。。你的算法被破坏了;它几乎不会给出最小值。改为使用
Math.floor
方法,并在范围中添加一个:

var randNumber = Math.floor(Math.random() * (max - min + 1)) + min;
要递归地执行此操作很简单,只需从方法本身调用该方法:

function generateNum (min, max) {
  var randNumber = Math.floor(Math.random()*(max - min + 1)) + min;
  if (randNumber == max) {
    randNumber += generateNum(min, max);
  }
  return randNumber;
}
您也可以在不使用递归的情况下解决此问题:

function generateNum (min, max) {
  var randNumber = 0;
  do {
    var num = Math.floor(Math.random()*(max - min + 1)) + min;
    randNumber += num;
  } while (num == max);
  return randNumber;
}

在这两种情况下都不需要使用一个数组,因为最终不需要SEPRATE值,只需要值的和。

< P>我会考虑一个想法,你不仅需要使用递归和数组,而且不需要使用for循环。 我认为您需要这样一个简单的表达式(为了清晰起见,分为三个):


假设一个随机数和另一个随机数一样好,这将为您提供与直接循环相同的值分布。

那么什么是“停止”条件,什么是“递归”条件?只需按照描述在代码中编写即可。不理解为什么需要递归。只要使用一个
while
循环和一个计数器,每当你得到
max
时,它就会递增。一旦你换了号码,就停下来。然后,结果是
计数器*max+randNumber
(或者如果您想返回一个数组,该数组也很容易创建,但两种方法都不需要递归)。那么问题到底是什么,似乎您拥有所有的逻辑?只需将数字存储在比函数作用域级别更高的数组中,并调用generateNum(min,max);就在那之后。我想你应该知道你的函数只有在极少数情况下才会返回“min”。不过,答案中有一个适当的随机数函数此代码中的?
min
参数是范围的下限,对于
generateNum(5,10),范围为5-10。。。满足
if(min==max)\return的示例是什么条件?@Brian这是一个防止它在内部循环的预防措施。如果
min==max
那么max将始终生成,并且它将永远继续生成随机数。太棒了!有一点需要澄清:我可能不应该使用数组,因为它是不必要的。最后,我只想返回总数,这将需要另一个循环来将
results
@Brian中的项目相加好的,我让函数返回一个数组,因为这是您要求的。(您也不需要循环,可以使用array.length),但如果您只需要返回出现次数,则返回出现次数会更好。我会更新我的答案。不用担心,我知道这就是我要求的。很抱歉,@Guffa看到了我要求的错误,我必须向他正式点头,这样其他人就不会犯我的错误。让你的问题保持原样,因为它提供了一个不同的解决方案。回答得好@Guffa!我注意到很少生成
min
值时出现了错误行为。另外,大+1指出数组是不必要的,这是一种解脱。@Guffa,您最好在第一个变体中将=+改为+=。否则,看起来你不会测试你的代码。只是为了重新迭代,因为其他答案都在冒泡。这绝对是最好的方法。
function generateNum (min, max) {
  var randNumber = 0;
  do {
    var num = Math.floor(Math.random()*(max - min + 1)) + min;
    randNumber += num;
  } while (num == max);
  return randNumber;
}
function generateNum (min, max)
{
    var randTail = Math.floor(Math.random()*(max - min)+min);
    var randRepeatMax = Math.floor(Math.log(Math.random()) / Math.log(1/(max-min+1)));
    return randRepeatMax*max + randTail;
}