[英]How to get unique numbers from Math.random in javascript?
當我在循環中調用此語句4次時,它會給出重復的隨機數。
var a = (parseInt(Math.random() * 4))+1
例如,有時它給我1,3,2,4(罰款!!),但有時它產生如1,3,1,4等。
我如何確保當我的循環運行4次時,我每次都會獲得獨特的設置
改組預填充陣列將是一個很好的解決方案:
// shuffle function taken from here
// http://stackoverflow.com/a/2450976/603003
alert( shuffle( [1,2,3,4] ) );
另一個項目包括以下功能:
function gen4Numbers() {
var numbers = [];
while (numbers.length < 4) {
var newNr = (parseInt(Math.random() * 4))+1;
if (numbers.indexOf(newNr) == -1) {
numbers.push(newNr);
}
}
return numbers;
}
alert(gen4Numbers());
應該警告您,此代碼很可能永遠循環。
你需要緩沖你的答案,但更好的方法是預先計算它們。
因此,例如,您想要1到4的隨機整數並且是唯一的,這與從1到4的值的數組隨機排序是一回事
對於一般情況:
// numbers of values
var n = 10;
// make initially sorted array
var arr = [];
for (var i=1; i<=n; ++i) { arr.push(i); }
// randomly sort the array
arr.sort(function () { return Math.random() - 0.5; });
現在arr將以隨機順序從1到10的所有數字,所以如果你想在該范圍內有4個唯一的隨機數,它們在arr [0],arr [1] arr [2],arr [3]
使n = 4
,你的問題解決了
我在用時間
var d = new Date();
var uniqId = d.getTime();
將數字存儲在一個數組中,每次檢查之前是否生成了數字。
如果你沒有產生很多數字,這是非常快的,因為你沒有
循環很多。
=============編輯1 =============
但是,如果你必須生成大量隨機數,我建議放一個數組
所有的數字,洗牌,然后取你需要的前n個數字。
陣列改組可以在這里找到:
http://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array
如果你想要一組龐大的數字,你應該存儲每個不同的數字,然后在循環的每次迭代中選擇一個。
var maxnB = 1000; // or 4
var list = [];
for (var i = 1; i <= maxNb; ++i) // store all number in a list [1, 2, 3, ... , maxNb]
list.push(i);
while (list.length > 0)
{
var pos = (parseInt(Math.random() * list.length))
var myNumber = list[pos]; // get your unique random number
list[pos] = list[list.length - 1]; // replace the number used with last number
list.pop(); //remove last number, decrease list.length by 1
// do something with your new number
}
這樣做,你有永遠循環的概率,如果pop()
方法和[]
運算符具有ao(1)時間復雜度訪問,它將改善時間處理,而不是每次在緩沖區列表中查找你的數字你得到一個新號碼來檢查。
做這個。
for( i = 0; i< 4; i++)
{
num = Math.floor((Math.random() * 3) + 1);
if(randomArray.indexOf(num)<0)
{
randomArray[i]=num;
}//endif
else
{
i=i-1;
}//endElse
}//endForLoop
基本上,如果一個數字被重復 - 在位置3處(randomArray [3]具有與randomArray [atAnotherIndex]相同的值),您的計數器將返回3並再次執行math.random,直到獲得唯一值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.