2014-12-02 32 views
0

我想要得到一个随机的整数,它是两个给定值之间的一个整数,并且尚未用javascript提取。 要做到这一点,我使用下面的代码:获取奇怪值的随机数字提取器

var extracted = []; 
 
function rand(){ 
 
var from = document.getElementById('from').value; 
 
var to = document.getElementById('to').value; 
 
var number = Math.floor(from) + Math.floor(Math.random() * to); 
 
var alreadyextracted = (extracted.indexOf(number) > -1); 
 
if(alreadyextracted){ 
 
\t var maximum = Math.floor(to) - Math.floor(from); 
 
\t var count = extracted.length; 
 
    if(count > maximum){document.getElementById('result').innerHTML='All numbers have been extracted.';} 
 
\t else{rand();} 
 
} 
 
else{document.getElementById('result').innerHTML=number; 
 
extracted.push(number); 
 
if(extracted[0] == number){var content = number;} 
 
else{var before = document.getElementById('got').innerHTML; 
 
var content = number + ', ' + before;} 
 
document.getElementById('got').innerHTML= content; 
 
} 
 
}
From: <input id="from" value="1"> 
 
To: <input id="to" value="10"> 
 
<input type="button" value="Extract" onclick="rand()"> 
 
<div id="result"></div> 
 
<div id="desc">Already extracted numbers:</div> 
 
<div id="got"></div>

它工作正常,如果我把一个“从”值低于10,但是,如果是较大的,它会得到一个完全随机的整数,并随机地说,即使它不是真的,所有的数字都被提取出来。
我没有看到任何东西在Firefox的控制台。
可能是什么问题?

+0

获得随机数字和忽略dups几乎从来没有任何项目真正需要。你想要的不是随机数字,而是一组随机数字的特定数字。因此,首先建立一个集合:创建一个整个范围的数组,然后从中提取一个数组,随机索引数组。 – 2014-12-02 20:15:19

+0

@LeeDanielCrocker你是对的,感谢您的评论:) – Stubborn 2014-12-02 20:17:02

回答

3

你这样做是错的。

用所有数字范围从最小到最大填充一个数组。

使用Fisher/Yates/Knuth shuffle混合阵列。

绘制尽可能多的数字,你需要。

(包括故意的任何代码,因为我没有解决您的问题)

+0

感谢您的回答,我太愚蠢了,不去想那件事!我会按照你的建议:) – Stubborn 2014-12-02 20:16:35

2

富豪是没有错,但问题就出在你的方式为你生成随机数:

var number = Math.floor(from) + Math.floor(Math.random() * to); 

这不是正确的方法来生成最小值和最大值之间的数字。这应该是:

function getRandomInt(min, max) { 
    return Math.floor(Math.random() * (max - min + 1)) + min; 
} 

使用由花钱提出的方法,然后使用该函数挑选一个元件在剩余的组(在这种情况下分钟将是0和最大剩余元素-1的数量)

+0

你是对的,谢谢你的回答:) – Stubborn 2014-12-02 20:17:31