Board logo

标题: [其他] 【已解决】随机数批处理在不同机子运行产生大量重复的疑惑 [打印本页]

作者: kofbld    时间: 2015-5-26 23:50     标题: 【已解决】随机数批处理在不同机子运行产生大量重复的疑惑

本帖最后由 kofbld 于 2015-5-30 00:24 编辑
  1. @echo off&setlocal EnableDelayedExpansion
  2. set "a=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  3. set "b=ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  4. set /a s1=%random%%%9+1
  5. set /a s2=%random%%%25+1
  6. set /a s3=%random%%%25+1
  7. set /a s4=%random%%%35+1
  8. set /a s5=%random%%%35+1
  9. set /a s6=%random%%%35+1
  10. set /a s7=%random%%%35+1
  11. set /a s8=%random%%%35+1
  12. set "s=%s1%!b:~%s2%,1!!b:~%s3%,1!!a:~%s4%,1!!a:~%s5%,1!!a:~%s6%,1!!a:~%s7%,1!!a:~%s8%,1!"
  13. >>d:\test.txt echo %s%
  14. endlocal
  15. exit
复制代码
以上代码实现随机生成8个随机字符,第1位1-9的数字,第2、3位26个大写字母,第4-8位随机数字或大写字母。
在单机随机生成基本不会重复,但是在不同机子上同时运行后,生成的随机字符合并后查重发现存在大量重复!
怀疑random伪随机的问题,请问大神们怎么才能解决不同机子同时或不同时运行该批处理尽量不产生重复呢?

补充:每一台单独运行均不会有重复,但是把每台生成的结果合并去重发现有大量重复!测试发现同时运行的话重复率极高,不同时运行也存在不少重复!
作者: kofbld    时间: 2015-5-27 14:34

传说中能让我结题的大神什么时候才路过,进来折腾下啊!
作者: CrLf    时间: 2015-5-27 15:31

http://bbs.bathome.net/viewthread.php?tid=18799
http://bbs.bathome.net/viewthread.php?tid=10146
时间相差不多,得到的随机数种子就会相似,随着调用 %random% 的次数增加,相似度会越来越低
作者: kofbld    时间: 2015-5-27 15:43

时间相差不多,得到的随机数种子就会相似,随着调用 %random% 的次数增加,相似度会越来越低
CrLf 发表于 2015-5-27 15:31


看来是没什么好办法了!有没有办法用uuid或guid来做呢?
作者: yangfengoo    时间: 2015-5-27 15:55

set /a s8=(%random%*%random%+%random%-%random%)%%35+1
会不会好一些
作者: kofbld    时间: 2015-5-27 16:03

本帖最后由 kofbld 于 2015-5-27 16:06 编辑
set /a s8=(%random%*%random%+%random%-%random%)%%35+1
会不会好一些
yangfengoo 发表于 2015-5-27 15:55



    其实我想应该是没什么区别的,单机随机生成10万个都不会重复的,只要同时运行100%重复。
作者: CrLf    时间: 2015-5-27 17:39

本帖最后由 CrLf 于 2015-5-27 17:41 编辑

同一秒的随机数种子是一样的,所以不要同时运行,或者对 %random% 进行二次加工,比如:
  1. set /a "rand=%random% * 1%time:~-2% & 0x7FFF"
复制代码
先用 %random% 乘以当前厘秒数,最后用与运算取得 0~0x7FFF 的区间,从而在同一秒内取得近似随机的概率分布

其实计算机的随机数都是伪随机数,c 语言里取随机数一般有两类随机数种子:当前时间、当前进程PID,cmd 的随机数是用时间做种子,而 c 语言取时间的函数只精确到秒,所以...
作者: kofbld    时间: 2015-5-30 00:23

谢谢大神解答,看来这水还蛮深的,要好好学习




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2