[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

本帖最后由 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伪随机的问题,请问大神们怎么才能解决不同机子同时或不同时运行该批处理尽量不产生重复呢?

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

传说中能让我结题的大神什么时候才路过,进来折腾下啊!

TOP

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

TOP

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


看来是没什么好办法了!有没有办法用uuid或guid来做呢?

TOP

set /a s8=(%random%*%random%+%random%-%random%)%%35+1
会不会好一些

TOP

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



    其实我想应该是没什么区别的,单机随机生成10万个都不会重复的,只要同时运行100%重复。

TOP

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

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

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

TOP

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

TOP

返回列表