[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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之间就好了。

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

回复 2# awk


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

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

TOP

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

TOP

返回列表