2012-10-20 140 views
2

JavaScriptJavaScript - 如何在沒有替換的情況下隨機抽樣項目?

我試過尋找這樣的東西,但我找不到它。

這是一個簡單的想法:

a。取0到10之間的隨機數。

b。比方說推出的隨機數是3

℃。然後,保存號碼(3)。 d)。現在,再次在0到10之間再取一個隨機數,但它不能是3,因爲它已經出現了。

+0

問題是什麼?你有沒有試圖編寫一個程序,如果是的話,你卡在哪裏?由於該程序的總體思路已經存在(您的子任務列表聽起來很好),並且應該可以工作。 – fvu

+0

您的問題沒有明確定義。第一個項目和第二個項目被選擇的概率是否必須相等,還是有意不同? – Kache

+0

是的,當然我已經嘗試過了,在互聯網上有很多關於用JS生成隨機數的代碼。但我不知道如何使c)和d) – seRgiOOOOOO

回答

11

一種解決方案是產生一個陣列(一「桶」)與所有要挑選的值,在這種情況下從0到10的所有數字。然後從該陣列選擇一個隨機和從桶中取出。請注意,下面的示例並不檢查桶是否爲空,因此如果您在下面調用該函數10次以上,將會出現錯誤。

var bucket = []; 

for (var i=0;i<=10;i++) { 
    bucket.push(i); 
} 

function getRandomFromBucket() { 
    var randomIndex = Math.floor(Math.random()*bucket.length); 
    return bucket.splice(randomIndex, 1)[0]; 
} 

// will pick a random number between 0 and 10, and can be called 10 times 
console.log(getRandomFromBucket()); 
+0

最優化和優雅的解決方案! – skovalyov

+0

真的很好! +1 –

+2

@skovalyov也許是最優雅的,但不是最優的 - 我上次測試時,「拼接」的速度大約是用'for'循環手動移動元素的一半。如果你不需要保持數組的順序,那麼最快的方法是將最後一個元素移動到隨機位置。 – Neil

1

Var rnd = getRnd();

雖然(!RND = lastRnd) RND = getRnd();

哪裏getRnd是產生你的隨機數的函數。

其實你就必須檢查,如果你當前的隨機數是在一個數組...如果你可以隨機數的列表很小提防無限循環的。

+0

理論上,如果你真的不走運,這可能會持續很長一段時間。 – Kache

0

您可以使用這樣的事情:

/** 
* range Get an array of numbers within a range 
* @param min {number} Lowest number in array 
* @param max {number} Highest number in array 
* @param rand {bool} Shuffle array 
* @return {array} 
*/ 
range: function(min, max, rand) { 
    var arr = (new Array(++max - min)) 
    .join('.').split('.') 
    .map(function(v,i){ return min + i }) 
    return rand 
    ? arr.map(function(v) { return [ Math.random(), v ] }) 
     .sort().map(function(v) { return v[ 1 ] }) 
    : arr 
} 

並使用它像這樣:

var arr = range(1, 10, true) 

現在,你必須按隨機順序從1 10號數組10和從不重複。所以,下次你可以這樣做:

arr.forEach(function(num, i) { 
    // do something, it will loop 10 times 
    // and num will always be a different number 
    // from 1 to 10 
}); 
0

只是爲了好玩:從@衍生Strilles回答 '鬥構造'

function RandomBucket(from,until){ 
    min = (Number(from) || 0); 
    max = (Number(until) || 10)+1; 
    this.bucket = String(Array(max-min)).split(',').map(function(i){ 
    return min++; 
    }); 

    if (!RandomBucket.prototype.get){ 
    RandomBucket.prototype.get = function(){ 
     var randomValue = 
     this.bucket.length < 2 
     ? this.bucket.shift() 
     : this.bucket.splice(Math.floor(Math.random()*this.bucket.length),1); 
     return randomValue || 'bucket empty'; 
     }; 
    } 
} 

使用d3JsFiddle的使用示例

0

var bucket = d3.shuffle(d3.range(11)); 

while(bucket.length) { 
    console.log(bucket.pop()); 
} 
相關問題