簡體   English   中英

如何從JavaScript中的Math.random獲取唯一數字?

[英]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次時,我每次都會獲得獨特的設置

改組預填充陣列將是一個很好的解決方案:

→jsBin.com

// shuffle function taken from here
// http://stackoverflow.com/a/2450976/603003
alert( shuffle( [1,2,3,4] ) );

另一個項目包括以下功能:

→jsFiddle

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM