iT邦幫忙

0

請問javascript如何生成隨機數 且不與上一個數字相同

  • 分享至 

  • xImage

請問我依照陣列的長度,可以生成0-5之間的整數亂數,

但我想要產生連續不一樣的整數,請問該怎麼做?

例如第一個數字生成0 , 第二個數字不能為0 , 但第三個數字可以為0 ,但下一個數字不能為0

var right = ['a','b','c','d','e'];

var left = parseInt(Math.random() * right.length);

console.log(left);

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
淺水員
iT邦大師 6 級 ‧ 2021-08-23 21:07:55
最佳解答

利用取餘數的方式,可以保證不跟前一個一樣,這樣就不需要迴圈了

//不與前一個數字重複的函數
let getNextRand = (function () {
    let randomVal = Math.floor(Math.random() * 5);
    return function () {
        //透過 +1 ~ +4 後對 5 取餘數就不會重複了
        randomVal = (Math.floor(Math.random() * 4) + 1 + randomVal) % 5;
        return randomVal;
    }
})();

//以下為測試
let testResult = [];
for (let i = 0; i < 20; ++i) {
    testResult.push(getNextRand());
}
console.log(testResult.join());
comw213 iT邦新手 5 級 ‧ 2021-08-24 11:16:40 檢舉

不好意思 想請問0 - 10之間 也可以這樣做嗎

我是想要每次輸出都不一樣 , 不想要放置到陣列中

淺水員 iT邦大師 6 級 ‧ 2021-08-24 11:53:00 檢舉

這樣嗎?
我測試那邊只是用陣列暫存結果再一次輸出而已
只是要取亂數呼叫 getNextRand 就可以了

//亂數函數產生器
function createMyRand(n) {
    let randomVal = Math.floor(Math.random() * n);
    return function () {
        //透過 +1 ~ +n-1 後對 n 取餘數就不會重複了
        randomVal = (Math.floor(Math.random() * (n - 1)) + 1 + randomVal) % n;
        return randomVal;
    }
}

//產生 0 ~ 9 的亂數產生器
let getNextRand = createMyRand(10);

//以下為測試
for (let i = 0; i < 50; ++i) {
    console.log(getNextRand());
}
1
yayapipi
iT邦新手 5 級 ‧ 2021-08-23 20:18:49
var right = ['a','b','c','d','e'];

var previous = -1; //開一個新的變量判斷
var left = parseInt(Math.random() * right.length);

while( left == previous ){
    left = parseInt(Math.random() * right.length);
}

console.log(left);

previous = left; //更新Previous
0

用C#寫個概念...語法不一定對

List<int> list = new List<int>();
for(int i=0 ; i<5 ; i++)
{
   if (i==0)
   { 
       List[i] = random();  //隨機取得0~9其中一數
   }
   else
   {
      List[i] = random();
      
      while( List[i]!= List[i-1] )  //當目前值與上一個值不同時才跳出迴圈
      {
         List[i] = random();
      }
   }
}

有很多更好的寫法,我懶得想太多,給你個想法~

我要發表回答

立即登入回答