每次單擊按鈕時,我都會嘗試選擇隨機的唯一數字。為此,我的功能是:
const chooseNumber = () => {
var r = Math.floor(Math.random() * 75) 1;
console.log(r)
while(selectedNumbers.indexOf(r) === -1) {
selectedNumbers.push(r);
}
console.log(selectedNumbers);
};
但問題是如果亂數已經在我的串列中,我需要再次單擊按鈕以生成新數字,直到找到不在串列中的數字。但是我想直接生成不在串列中的號碼,所以我不需要每次都點擊按鈕。謝謝你的幫助。
uj5u.com熱心網友回復:
你在正確的軌道上,除了while回圈應該用于亂數生成器,而不是將數字推入陣列:
const selectedNumbers = [];
const chooseNumber = () => {
let r;
do
{
r = Math.floor(Math.random() * 75) 1;
}
while(selectedNumbers.indexOf(r) > -1)
selectedNumbers.push(r);
console.log(r, "[" selectedNumbers "]");
};
<button onclick="chooseNumber()">Generate</button>
請注意,這最終可能導致凍結,因為沒有故障安全檢查陣列是否已滿,因此我們還應該檢查陣列的長度:
const selectedNumbers = [];
const maxNumber = 75;
const chooseNumber = () => {
let r;
do
{
r = ~~(Math.random() * maxNumber) 1;
}
while(selectedNumbers.indexOf(r) > -1 && selectedNumbers.length < maxNumber)
if (selectedNumbers.length < maxNumber)
selectedNumbers.push(r);
else
console.log("array is full");
console.log(r, "[" selectedNumbers "]");
};
for(let i = 0; i < 76; i )
{
chooseNumber();
}
<button onclick="chooseNumber()">Generate</button>
uj5u.com熱心網友回復:
您的 while 回圈是不必要的。您可以改用“if”陳述句。
為避免再次單擊按鈕,您可以執行遞回函式,例如:
const chooseNumber = () => {
var r = Math.floor(Math.random() * 75) 1;
console.log(r)
if(selectedNumbers.indexOf(r) === -1) {
selectedNumbers.push(r);
console.log(selectedNumbers);
} else {
chooseNumber();
}
};
uj5u.com熱心網友回復:
不要依賴回圈在有限范圍內生成唯一(看不見的)整數。
首先,一旦范圍內的所有值都用盡了,就沒有任何可能性了,因此在下一次呼叫時,您將陷入無限回圈。
其次,它浪費了處理器,因為您在每次呼叫時都生成了無用的值。
相反,提前(一次)生成范圍內的所有值,然后將它們打亂并在每次呼叫時從陣列中獲取最后一個(并在沒有剩余時拋出錯誤):
/**
* Durstenfeld shuffle
*
* - https://stackoverflow.com/a/12646864/438273
* - https://en.wikipedia.org/wiki/Fisher–Yates_shuffle#The_modern_algorithm
*/
function shuffleArray (array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i 1));
[array[i], array[j]] = [array[j], array[i]];
}
}
/** Get shuffled array of all integers in range */
function generateShuffledIntegerArray (min, max) {
const arr = [];
for (let i = min; i <= max; i = 1) arr.push(i);
shuffleArray(arr);
return arr;
}
const getUniqueInt = (() => {
const numbers = generateShuffledIntegerArray(1, 75);
return () => {
const n = numbers.pop();
if (typeof n === 'number') return n;
throw new Error('No unique numbers remaining');
};
})();
// Will log 75 integers, then throw on the 76th invocation:
for (let i = 1; i <= 76; i = 1) {
const n = getUniqueInt();
console.log(`${i}:`, n);
}
TypeScript Playground 中的代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/492525.html
標籤:javascript html 随机的
