點樣令java random number random d

本帖最後由 twaiho2003 於 2016-6-10 18:29 編輯

我發覺JAVA random number 成日gen好接近既數字,
所以我做左個實驗, 抽4個 9 000 000 以內既數字, 但我發覺成日有相同既最大位數 或者好接近既最大位數
例如,
1 xxx xxx, 1 xxx xxx, 8 xxx xxx, 9 xxx xxx
5 xxx xxx, 5 xxx xxx, 6 xxx xxx, 6 xxx xxx


如果按機率, 我抽一個數字,  例如 1 xxx xxx,   再抽多3個, 有相同最大位數既機率應該係 1/9 + 1/9 + 1/9 = 1/3
(有錯請指教)

如果我試100次,   照計得33次左右出現相同最大位數,但結果成日多個50次,
改做 1 000 000 000次,  不斷出result 5 390 xxx 次
  1.     public static void main(String[] args) {
  2.         Random random = new Random();
  3.         int repeat_count = 0;

  4.         Set<Integer> num_set = new HashSet<>();

  5.         for (int times=0;times<1000;times++) {
  6.             for (int i=0;i<4;i++) {
  7.                 int num = random.nextInt(9000000);
  8.                 num_set.add(num/1000000);
  9.                 System.out.println(num);
  10.             }
  11.             if (num_set.size() < 4) {
  12.                 repeat_count++;
  13.                 System.out.println("repeated");
  14.             }
  15.             num_set.clear();
  16.             System.out.println("");
  17.         }

  18.         System.out.println("Repeat Count:" + repeat_count);
  19.     }
複製代碼

方向: 拿系統時間做SEED。

TOP

如果你係*nix env,就直接係/dev/random讀個int出黎
windows就算把啦

TOP

既然個result 係咁,我諗諗下,係咪0-8,抽4個, 有53.9%有重履呢
係咪我機率計錯

TOP

本帖最後由 EITCo 於 2016-6-10 19:16 編輯

5390xxx次好吻合理論值,只係你對個機率有誤解

好多人以為隨機就係要各數值均勻輪住出
其實間中就有重覆都係正常現象
因為「出過唔會咁快又出」的話
咪即係有路捉,咁就唔係完全隨機啦

吹完水都要計計數,樓主問題等價於:
隨機抽由0至8的整數 (共9個可能),抽4次,有幾大機率有重覆?

只抽左第一個數時,得一個數當然無重覆
抽第二個數時,唔撞第一個的機率係8/9
抽第三個數時,如果仲未有重覆,就一定要避開頭兩個,所以機率係7/9
抽第四個數時,如此類推係6/9
於是8/9 * 7/9 * 6/9就得約0.539095
其實好吻合實驗

TOP

Random uses the system clock as the seed/or to generate the seed. So they can be reproduced easily if the attacker knows the time at which the seed was generated. But SecureRandom takes Random Data from your os(they can be interval between keystrokes etc - most os collect these data store them in files -/dev/random and /dev/urandom in case of linux/solaris) and uses that as the seed. 

TOP

5390xxx次好吻合理論值,只係你對個機率有誤解

好多人以為隨機就係要各數值均勻輪住出
其實間中就有重覆都 ...
EITCo 發表於 2016-6-10 19:13
好多人以為隨機就係要各數值均勻輪住出
其實間中就有重覆都係正常現象
因為「出過唔會咁快又出」的話
咪即係有路捉,咁就唔係完全隨機啦

講得非常好,好多人都誤解以為 random 就要 evenly distributed, 咁 given range 1-1000, 第1000個 output 豈不是就會俾你捉到?全錯,咁只係打亂數列,唔係捉唔到路既隨機

TOP

講得非常好,好多人都誤解以為 random 就要 evenly distributed, 咁 given range 1-1000, 第1000個 out ...
ethernor 發表於 2016-6-10 20:15



   

TOP

回覆 5# EITCo

多謝咁詳細既解答 , 原來真係有咁大機會重履
  1.         Set<Integer> num_set = new HashSet<>();
  2.         int count = 0;
  3.         int repeat_count = 0;
  4.         for (int a=0;a<9;a++) {
  5.             for (int b=0;b<9;b++) {
  6.                 for (int c=0;c<9;c++) {
  7.                     for (int d=0;d<9;d++) {
  8.                         count++;
  9.                         num_set.add(a);
  10.                         num_set.add(b);
  11.                         num_set.add(c);
  12.                         num_set.add(d);

  13.                         if (num_set.size() < 4) {
  14.                             repeat_count++;
  15.                         }
  16.                         num_set.clear();
  17.                     }
  18.                 }
  19.             }
  20.         }
  21.         System.out.println((double) repeat_count / count); // 0.5390946502057613
  22.     }
複製代碼
不過都要加埋你個解答我先清楚D

TOP

本帖最後由 snoopy11hk 於 2016-6-10 22:17 編輯
5390xxx次好吻合理論值,只係你對個機率有誤解

好多人以為隨機就係要各數值均勻輪住出
其實間中就有重覆都 ...
EITCo 發表於 2016-6-10 19:13



    講起又講, 你咁講我又記番學 C 的時候, 講的 seeding 好似係shift個 nonuniform distribution 的 skewness
其實 random 真係唔等於 uniform distribution

TOP