3 回答

TA貢獻1820條經驗 獲得超10個贊
您得到了一些很棒的編程答案。這是一種更具理論色彩的全景圖:-)
您的問題稱為“采樣”或“子集采樣”,您可以通過幾種方法來執行此操作。讓N
是你所抽樣框的范圍內(即N=X+1
),并M
為您的樣品(你想挑元素的數量)的大小。
如果
N
比更大M
,您將要使用一種算法,例如Bentley和Floyd在他的專欄“ Programming Pearls:輝煌的示例 ”中建議的算法(此處暫時不帶ACM的鎖定屏幕而提供),我真的推薦這樣做他們明確給出代碼并根據哈希表等進行討論;那里有一些整潔的花樣如果
N
與處于同一范圍內M
,則您可能需要使用Fisher-Yates隨機播放,但僅需M
一步即可停止(而不是N
)如果您真的不太了解,那么Devroye關于隨機生成的書第647頁上的算法非???。

TA貢獻1895條經驗 獲得超3個贊
我寫了這個功能。它使用生成的數字的歷史記錄保留其自己的數組,防止初始重復,如果范圍內的所有數字均已輸出一次,則繼續輸出隨機數:
// Generates a unique number from a range
// keeps track of generated numbers in a history array
// if all numbers in the range have been returned once, keep outputting random numbers within the range
var UniqueRandom = { NumHistory: new Array(), generate: function(maxNum) {
var current = Math.round(Math.random()*(maxNum-1));
if (maxNum > 1 && this.NumHistory.length > 0) {
if (this.NumHistory.length != maxNum) {
while($.inArray(current, this.NumHistory) != -1) { current = Math.round(Math.random()*(maxNum-1)); }
this.NumHistory.push(current);
return current;
} else {
//unique numbers done, continue outputting random numbers, or we could reset the history array (NumHistory = [];)
return current;
}
} else {
//first time only
this.NumHistory.push(current);
return current;
}
}
};
這是一個工作中的小提琴
我希望這對某人有用!
編輯:正如下面的Pointy所指出的,它在較大范圍內可能會變慢(這是一個 小提琴,在0-1000的范圍內運行,似乎運行良好)。然而; 我并不需要很大的范圍,所以如果您希望生成并跟蹤很大的范圍,則此功能可能確實不適合。
添加回答
舉報