Java ????????????
???????????? ???????[ 2012/8/2 10:36:39 ] ????????
???????????????????seed????????nextseed???????????????ж?????????????????????????????????????????????????????seed??????????????????????????????????????seed??????????????seed???????????????????????????????
?????????????????????????????????????java.security.SecureRandom??????α?????Random??????????Random??????????next??n???????????????????????????????????????SHA1PRNG???????????????
????Ч???????????????????1??????????
static int r3(int n) {
final int offset = 123456; // offset????????????μ??????????????????е??salt?е??????
long seed = System.currentTimeMillis() + offset;
SecureRandom secureRandom1;
try {
secureRandom1 = SecureRandom.getInstance("SHA1PRNG");
secureRandom1.setSeed(seed);
return secureRandom1.nextInt();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return 0;
}
??????????
????a??nextInt(n)????????
?????ú??????е???????31λ?????????Χnext(31)???????[0??n)??Χ????????????????????????????????????????????????????????????о???????????Χ??1??100????????????μ????????Χ?1??30????????????????????Χ??????????????飬???????100????30?????????????μ?????????????[1??30)?? [31?? 60)?? [61?? 90)?? [91??100)?????????????????У?????1??10?????????????11??30??????jdk???????????????????????31bit??????????[0??n)????????next(31)????????????????????????????????nextInt(n)?????????????????????
??????n??2?????????????n???????2^31???????????????????????????next(31)?????ɡ?
??????n????2??????????????????????????е?????????????????????????bits - val + (n-1) < 0 ????ж??????????????????????????????ж???????????
???????? 2^31 / n = max ...val ??val??2^31????n???????? max???????2^31-val=nMax ???????????2^31????????n???????????[nMax??2^31)??????????????bits?????????Χ??????????????????????????????nMax < 2^31 < n(Max+1)
??????????bits = next(31)??????????[0??2^31)????????????
????????bits<nMax????bits - val???????n??????????(С??Max)?У???bits-val+n-1???С??nMax??????????????????????
????????bits>=nMax????bits-val = nMax?? ??bits-val+n-1=nMax+n-1=n(Max+1) - 1 > 2^31 -1 ?????????bits>=nMax????bits-val+n-1 >= 2^31 ??????int??2^31?????????2^31<0??
??????????while(bits-val+n-1 < 0) ???ж????????????
????b??nextInt(n)????????????????С??2
???????a??????nextInt(n)???????????????????????????????????????????????????????????????nextInt(n)??javadoc?????????n=2^30+1??????[nMax??2^31)???Χ????????????n<2^30+1??С?????????????newMax???[nNewMax?? 2^31) ???Χ??С??
??????n=2^30+1?????????Χ[2^30+1?? 2^31)??????Χ[0?? 2^30)?????????????????????????????50%????????????????????????50%??????????
?????????????????nextInt(n)?????????next(n)????С??2????????????Math.random()???????
??????
![](/images/ad-banner/ad-banner.png)
???·???
??????????????????
2023/3/23 14:23:39???д?ò??????????
2023/3/22 16:17:39????????????????????Щ??
2022/6/14 16:14:27??????????????????????????
2021/10/18 15:37:44???????????????
2021/9/17 15:19:29???·???????·
2021/9/14 15:42:25?????????????
2021/5/28 17:25:47??????APP??????????
2021/5/8 17:01:11