列出不重複的隨機亂數

要如何列出不重複的隨機亂數呢?

因為隨機亂數連續取值,會產生重複號碼。
要解決這個問題。

例如:程式輸出  樂透彩 選號 49個數字隨機取6個
想到三個陣列方法。



  • 方法一:直接把全部數字49個號碼儲存在陣列裡面,
    再用迴圈跑個一輪做隨機元素交換,for(i=0; i<arr.length; i++),
    迴圈裡面用一個隨機亂數取值,
    指到哪個元素就 i=序列的元素跟那個隨機元素交換。


  • 方法二:如同方法一把全部數字49個號碼儲存在陣列裡面,
    再用隨機方式取出陣列裡的元素號碼,並且重新設定該元素內的
    值為號碼以外的值,像是負一或其他,然後再繼續隨機取值,
    如果取到的值為設定的取出重設值(代表已經選過了),就再來一次。


  • 方法三:使用兩個迴圈,內層迴圈裡隨機亂數取值,然後再跟之前
    取過號碼的元素做比較,如果發現有一樣的號碼,可以使用i--讓
    隨機亂數在重找一遍號碼,當然外面迴圈跑到越後面,後面的元素
    取得的號碼跟前面重複的機會就越高。所以,這個迴圈會跑個很多次,
    使用計數器,發現49取49個亂數的迴圈跑個四百多次都有可能。
  • 方法四:已選出來的,把儲存值更改成零或負一..

Javascript使用方法二更方便,直接刪除已經取得的號碼。
<script type="text/javascript">
  var arr =[];
    for (i=0;i<49;i++){ 
      arr[i]=i+1;
    }
  var rancodes6= new Array(6);
  function ans(){
    var x;
    for(i=0;i<6;i++){
      //這邊記得要用49-i,元素每取走一個,就少一個。
    x=Math.floor(Math.random()*(49-i))
    rancodes6[i]=arr.splice(x,1);
  }
  return rancodes6;
  }
    document.write("<div style='font-size:30px'>",ans(),"</div>");
    document.write(arr.length,"</div>");
</script>

JS使用方法三 49隨機取49 恩哈哈
<script type="text/javascript">
  var a = [49];var count=0;
  for(i=0 ; i<49 ; i++){
    temp = Math.floor(Math.random()*49+1);
    count ++;
    if(a.indexOf(temp)<0){
      a[i]=temp;
    }else{ i-- }
}
  document.write( a+"總共跑了幾次:"+count )
</script>

可以再用排序法把陣列依序排列
for(i=0; i<a.length-1; i++){
  for(j=i+1; j<a.length;j++){
    if(a[i]>a[j]){
      temp=a[i];
      a[i]=a[j];
      a[j]=temp;
  }
  }
}

要注意JS的陣列排序,像是 3會比25,20還要大,因為它會自動拿字元編碼來比較,
而不是數字大小。
所以上面的排序法比較要改寫成 
if( parseInt(a[i]) > parseInt(a[j]) )

寫程式就是這樣,一堆細節沒注意,結果就不如意。
目前暫時想到這些。

留言

  1. 要注意JS的陣列排序,3會比25,20還要大,因為它會自動拿字元編碼來比較,
    而不是數字大小。

    回覆刪除

張貼留言

這個網誌中的熱門文章

Use Case Description(描述使用案例)

Tomcat 讀取中文檔案的方法