2013-02-15 104 views
-2

我遇到了一個很奇怪的問題。我試圖找到解決辦法,但徒勞無功。我的問題是我想創建一個1-45之間的隨機數,我不希望這個數字再次重複。想在1-45之間產生隨機數而不重複

+3

以一個。數組,填充數字範圍,隨機數,彈出 – C5H8NNaO4 2013-02-15 06:30:16

+0

-1的值。不費力。沒有替換的隨機抽樣並不是一個奇怪的問題,在編程的教科書中經常遇到這種問題,並且有許多語言(包括js)在線解決方案。如果你使用了「javascript random without replacement」,前三個結果是從stackoverflow,第一個是http://stackoverflow.com/questions/12987719/javascript-how-to-randomly-sample-items-without-replacement。另見http://stackoverflow.com/questions/11935175/sampling-a-random-subset-from-an-array。 – Paul 2013-02-15 06:52:32

回答

4

按照定義,隨機選擇將隨機重複。

但是,您可以構建一個包含每個數字的數組,然後洗牌數組,產生數字的隨機順序沒有重複。

var nums = [], i; 
for(i=1; i<=45; i++) nums.push(i); 
nums.sort(function(a,b) {return Math.random()-0.5;}); 
alert(nums.join(",")); 
+0

+1 for Math.random()-0.5 – C5H8NNaO4 2013-02-15 06:41:52

+2

請謹慎[隨機化數組,儘管...](http://www.robweir.com/blog/2010/02/microsoft-random-browser-ballot。 HTML) – maerics 2013-02-15 06:50:15

+0

由於工作就像一個魅力+1從我身邊 – 2013-02-15 07:25:30

0

這是工作代碼..

Random rd =new Random();  
int n = rd.Next(1,45); 
+0

>>新的隨機()----「‘隨機’未定義」 – 2013-02-15 06:43:37

+0

這一定是的JScript/.NET,而不是純JavaScript。 – maerics 2013-02-15 07:06:10

+0

你確定這不是java? – C5H8NNaO4 2013-02-15 07:06:20

0

你真正想要的是在給定的範圍內,以創建一組數字和隨機取出一個號碼,直到設置爲空。

這裏是產生另一個功能,正是如此的函數:

function generateRandomRangeSet(beg, end) { 
    var numbers = []; // Create an array in range [beg, end]. 
    for (var i=beg; i<=end; i++) { numbers.push(i); } 
    return function() { 
    if (numbers.length < 1) { throw new Error('no more numbers'); } 
    var i=Math.floor(Math.random()*numbers.length), number=numbers[i]; 
    numbers.splice(i, 1); // Return and remove a random element of the array. 
    return number; 
    } 
} 

var r = generateRandomRangeSet(1, 45); 
r(); // => 9 
r(); // => 24 
r(); // => 7 ... for each number [1, 45] then ... 
r(); // Error: no more numbers 
+0

憑藉Object.prototype中的新方法。上述代碼在IE8及以下版本中失敗。 – 2013-02-15 06:42:56

+0

@Kolink:已更新,可與任何版本的ECMAScript一起使用。 – maerics 2013-02-15 07:03:18