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

[数值计算] 批处理如何在某个范围内取随机值,而且在一般情况下不能跟上次的值过于接近?

本帖最后由 BAT1 于 2011-12-20 23:28 编辑

取值的需求如下:
在某个范围内取随机值,在(设定)概率内不能跟上次的值过于接近。

例如:
在 1~25 内取随机值(设“接近”的值为正负5),仅有百分之十的情况会出现跟前次取值在正负5之内的数字。
那么可以出现这样的数字
9      14      2         18      10       25       5        16           22           11          7       10(10跟前一个数字比较接近,出现的概率假设为50分之1)

不可以出现这样的数字
2         10          4          12            6            13           7              14   (规律太过于明显的数字不行)
2         16         19         10          13            12           9               7    (大部分数字都非常接近)
7         18           7          22           5            16          24             11          17       20(最开始那几个数字尽量不要太接近,更不要重复)

另外,代码要插入到一个超大脚本的中间部分,所以要支持GOTO调用

前面代码.....
:2
代码放在这样的位置(每次只取一个随机值,假如运行到后面会转跳回来,就按上面的要求取随机数)
用取到的随机数,作平均数,生成三个随机数,三个随机数,随机数字相差不能在2以内,但又不能相差太大,超过中间值的百分之十五就算太大。
goto 3(取够随机值,跳到标签3)
goto 2 (再次取值,第二次取值时,要考虑到限制的条件)
:3
后面代码......


如果不想看上面的内容,简单的说只有一句话,要取几次随机数字,尽量让他们显的杂乱无章,越乱越好。
我用%random%取余数,不知道什么原因跟前一次取到的数值,经常只是加减2~5左右,太过于接近了,要在在5~13之间就好了。

你生成之后先判断一下跟上一个值的差是否在5以内,是的话就抛弃,重新生成。

TOP

本帖最后由 BAT1 于 2011-12-20 23:22 编辑

回复 2# awk


      假如把这个思路用在 总数为25的数字,假设上次取值为10。那么,下次取值在5至15之间都要抛弃。(11/25 能取的只有 14个值一小半的值都不能用,差不多取25次值,有11次是作废的)
    而且,我还要引用这个数值,用上面这个数作平均数,取他的子值,在指定范围内再取三次值,如果有两个数相同或者相差为1就抛弃。

那么估算下来,将会有百分之八十的取值会被作废。代码的无效运行次数将会大大增加。
能否想个比这个方法要高效一点的?比如,在第二次取值时直接排除掉跟第一个数字邻近的那几个数字。第三次取值时,只排除掉第一次所取值正负1以内的数字,以及相对于第二次的指定范围的数字。

TOP

回复 3# BAT1


分成5组:
1 2 3 4 5
6 7 8 9 10
...
21 22 23 24 25 26

先生成一个1至5的随机数X,用X来决定从第几组里面取数据。
然后X=(X+2)%5+1,用X来决定从第几组里面取下一个数据。

TOP

这个思路我先试一试,应该可以搞定了。

TOP

我看分5组也不能排除得了某组上限与下一组下限依然差值太小的可能
彻底避免不合格值的方法可以每取一个值后才计算不合格值范围,从总范围内排除后再从中取随机值,虽然麻烦,但绝对有效

TOP

回复 6# yyykkkyyyy


再仔细看看4楼这个:
X=(X+2)%5+1

TOP

回复  yyykkkyyyy


再仔细看看4楼这个:
X=(X+2)%5+1
awk 发表于 2011-12-21 10:50



    确实我没仔细看,也没必要细看,因为只要说是分组,如果与前次的组相邻的组不排除,就是我在6楼说的情况,如果也要排除相邻组相当于仅从 2~3 组里取值了,显然又过多地排除了,似乎于随机的概率上也不合适,除非说相邻组里也会视情况取一部分,那就和我说的没区别了,只是方法上更具体。
不管是哪种,其实总的思路你我是相同的,就是要从取随机范围里把不合要求的先排除了去取随机值,而不是取了值后判断是否合适。
说实话,楼主的完整要求我都还没看明白,似乎并不在意有相近的值,只是要控制概率不要大了,他自己也会写这代码,也许你提供的思路正是他所需要的

TOP

a=!random!%25+1
b=(a+5+!random!%8)%25+1

TOP

我先问问,是不是这样:
假如数是14,那么下一个取值是1~9或19~25?

TOP

标题

本帖最后由 bluewing009 于 2011-12-21 21:28 编辑

我就先按这个说了……
取一个随机数,判断是不是在12~20,是的话,a=,然后随机一个值,判断是不是大于5(1~10中取),大于取大于组,小于取小于组;大于组:b=!random!%(20-!a!)+(!a!+5),小于组同理。
>20:b=!random!%8+(!a!-13)
5<X<12:也是判大于组小于组,说小于组写法:b=!random!%(!a!-5)+1

TOP

本帖最后由 bluewing009 于 2011-12-21 21:35 编辑

就是1~25分成A:1~5,取+5~13;B:6~12,取1~X-5或x+5~x+13;C:13~20,取x-13~x-5或x+5;D:20~25,取x-13~x-5
或情况就取10随机数判大于小于5

TOP

本来可能楼主已经有答案了,随机的事嘛也没必要太认真。但看到9楼答的,又想说两句,确实是简捷高效,我没这么具体量化,其实也有过思考,如果老是下一个数往+的方向加的话似乎也不够随机——总是往“递增”方向发展,过限回头继续。还想过可以另取随机值仅决定+- , 但是看到楼主似乎要求不相邻的数里也不允许重复,并在强调概率范围,又还有些话的意思没太明白就没细想了

TOP

又是数学,考思维,好好练吧,我数学最差了。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

楼主正在闷头写代码呢哈哈

TOP

返回列表