无忧启动论坛

标题: 批处理里面概率执行 [打印本页]

作者: zhxy9804    时间: 2017-12-28 21:10
标题: 批处理里面概率执行
批处理里面有两段
:1
:2
如何概率运行:1为十分之一,:2为十分之九?
谢谢!
作者: zhxy9804    时间: 2017-12-28 21:11
就是想做一个概率跳转的命令,执行1的概率为十分之一,2的概率为十分之酒
作者: slore    时间: 2017-12-28 21:28
  1. %random%
复制代码

作者: Juno_Jr.    时间: 2017-12-28 22:10
本帖最后由 Juno_Jr. 于 2017-12-28 22:12 编辑
zhxy9804 发表于 2017-12-28 21:11
就是想做一个概率跳转的命令,执行1的概率为十分之一,2的概率为十分之酒


http://www.jb51.net/article/36489.htm
作者: 不知    时间: 2017-12-28 22:25

  1. @echo off
  2. set /a ret=%random%%%10
  3. if /I 0%ret% EQU 0 call :1
  4. if  /I 0%ret% NEQ 0 call :2
复制代码
根据上楼的用以上代码测试通过。

作者: lbw2007    时间: 2017-12-28 22:48
不知 发表于 2017-12-28 22:25
根据上楼的用以上代码测试通过。

学习了
作者: slore    时间: 2017-12-28 23:02
太长了
  1. if %random:~1,1% EQU 1 ( echo 1 ) else (echo 9)
复制代码

作者: nttwqz    时间: 2017-12-28 23:25
此刻,十分凸显数学的重要性,哈哈~

谁能简单扼要的讲解下那个余数公式?对于不上学多年的我来说,现在只能死记硬背了。


作者: nttwqz    时间: 2017-12-28 23:25
slore 发表于 2017-12-28 23:02
太长了

你这不成功,我双击了30多次,都是9……
作者: slore    时间: 2017-12-28 23:29
nttwqz 发表于 2017-12-28 23:25
你这不成功,我双击了30多次,都是9……


扔5次硬币都是正面,能说扔硬币不是50%概率么?

随机一个数,末尾是1的概率是多少?
作者: nttwqz    时间: 2017-12-28 23:52
slore 发表于 2017-12-28 23:29
扔5次硬币都是正面,能说扔硬币不是50%概率么?

随机一个数,末尾是1的概率是多少?


我双击了30多次,实际效果胜过所有道理!

手动输入你的代码也是这样。

C:\>echo %random:~1,1%
5

C:\>echo %random:~1,1%
5

C:\>echo %random:~1,1%
8

C:\>echo %random:~1,1%
8

C:\>echo %random:~1,1%
9

C:\>echo %random:~1,1%
2

C:\>echo %random:~1,1%
5

C:\>echo %random:~1,1%
5

C:\>echo %random:~1,1%
4

C:\>echo %random:~1,1%
3

C:\>echo %random:~1,1%
5

C:\>echo %random:~1,1%
9

C:\>echo %random:~1,1%
4

C:\>echo %random:~1,1%
0

C:\>echo %random:~1,1%
4

C:\>echo %random:~1,1%
9

C:\>echo %random:~1,1%
0

C:\>echo %random:~1,1%
9

C:\>echo %random:~1,1%
2

C:\>echo %random:~1,1%
7

C:\>echo %random:~1,1%
2

作者: nttwqz    时间: 2017-12-28 23:54
不知 发表于 2017-12-28 22:25
根据上楼的用以上代码测试通过。

前两次手动打开二十多次,都成立,后来不成立了,用命令测试也一样,看来这个也只能“随机”了


作者: slore    时间: 2017-12-29 00:08
本帖最后由 slore 于 2017-12-29 00:23 编辑
  1. Microsoft Windows [版本 10.0.15063]
  2. (c) 2017 Microsoft Corporation。保留所有权利。

  3. C:\Users\MyPC>echo %random:~1,1%
  4. 1

  5. C:\Users\MyPC>echo %random:~1,1%
  6. 4

  7. C:\Users\MyPC>echo %random:~1,1%
  8. 2

  9. C:\Users\MyPC>echo %random:~1,1%
  10. 6

  11. C:\Users\MyPC>echo %random:~1,1%
  12. 5

  13. C:\Users\MyPC>echo %random:~1,1%
  14. 7

  15. C:\Users\MyPC>echo %random:~1,1%
  16. 2

  17. C:\Users\MyPC>echo %random:~1,1%
  18. 5

  19. C:\Users\MyPC>echo %random:~1,1%
  20. 7

  21. C:\Users\MyPC>echo %random:~1,1%
  22. 4

  23. C:\Users\MyPC>echo %random:~1,1%
  24. 1

  25. C:\Users\MyPC>
复制代码


这个结果,如果你想看的不是1,而是8或者9,是不是又说不通了?(没出现概率为0)
作者: slore    时间: 2017-12-29 00:22
random得到的是0~65535
取第一位
0出现的概率为1/65535,其他数字是1/9,所以1:9的概率的话是不对的(1:8)。取-2,-1来去最后一位才对。

1位数 0~9                 1/10
2位数 10~99               1/10
3位数  100~999           1/10
4位数  1000~9999       1/10
5位数  10000~65529  1/10
5位数   65530,65531,65532,65533,65534,65535,没有6,7,8,9所以,0~5比他们高1/65535的概率,但是按1/10来说完全可以忽略。
另外,系统的随机一般是按时间种子计算,你可以控制调用间隔,结果会变化,但是你执行更多次(千,万级),次数越多越接近。

反正要的是个“随机”,要是在这个上面钻牛角尖的话,我也无话可说。


作者: nttwqz    时间: 2017-12-29 00:45
slore 发表于 2017-12-29 00:22
random得到的是0~65535
取第一位
0出现的概率为1/65535,其他数字是1/9,所以1:9的概率的话是不对的(1 ...

我数学学的不好,更没研究过概率,但从实际双击执行来看,不知的更加接近1/10。

我就觉得吧,你只取第二位数,怎么算出来0出现的概率是1/10呢?要是0-9,每个数字出现的概率是一样的,这容易理解。

话说,为何网上都说random是0-65535,可是Win8.1 set帮助里面明明写的是0-32767!
作者: slore    时间: 2017-12-29 00:57
标题: u
本帖最后由 slore 于 2017-12-29 09:12 编辑
nttwqz 发表于 2017-12-29 00:45
我数学学的不好,更没研究过概率,但从实际双击执行来看,不知的更加接近1/10。

我就觉得吧,你只取第 ...


我是想取最后一位的,又想了想随便一个数就取开头也一样吧。就随意写了1,1。
就是个1行文的思路,就和我第一个回复帖只写%random%,一样,让楼主自己去了解这个用法,
没有详细思考,那是使用的人该考虑和测试的事情(我又没有这种需求)。

批处理的话,从0开始,所以结果是你说的第2位。
如果随机数是1,2,3呢?没有第二位,会报错的。取第二位是错误的。

版本不一样,系统改了吧(也许首位有溢出BUG修复掉了,另外WIN10也是32767),还是,求余吧。(按10求余,其实也是去最后一位(个位),不是绝对1/10)

32767*2=?



作者: nttwqz    时间: 2017-12-29 01:00
slore 发表于 2017-12-29 00:57
我是想取最后一位的,又想了想随便一个数就取开头也一样吧。就随意写了1,1。
就是个1行文的思路,就和我 ...

都是夜猫子……
作者: nttwqz    时间: 2017-12-29 19:36
我也弄个不同思路的,同样不是绝对的十分之一

  1. if %time:~-2% geq 10 (echo %%90) else echo %%10
复制代码

作者: quya    时间: 2017-12-29 21:23
本帖最后由 quya 于 2017-12-29 21:36 编辑

要完全的 1/10 和 9/10 概率, 应该是

  1. set /a x=10*%random%/32767 >nul& if %x% equ 0 (echo 1/10) else echo 9/10
复制代码


但是真如Slore所说,完全可以忽略精确性, 几乎没啥区别。我还是倾向于7楼的代码,简洁多了。

然后其实没啥用,%random%都是伪随机。
作者: zhxy9804    时间: 2017-12-31 21:31
感谢各位的回答!受教了
作者: icevan    时间: 2018-1-11 22:46
个人觉得概率上的东西来说样本都该无穷大才能说明。

你要的十分之一其实是10次里必须要出现一次。

而 实际上的概率是说每一次判断都有十分之一 的机会出现,有点拗口。
楼上有个丢硬币的例子就是,每一次丢出现正面个概率都是50%,但 这个次数的样本 无穷 大才行,





欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3