带递归的随机数JavaScript
我试图创建一个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
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/10generateNum(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;
}