标题:
[数值计算]
批处理如何在某个范围内取随机值,而且在一般情况下不能跟上次的值过于接近?
[打印本页]
作者:
BAT1
时间:
2011-12-20 21:56
标题:
批处理如何在某个范围内取随机值,而且在一般情况下不能跟上次的值过于接近?
本帖最后由 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之间就好了。
作者:
awk
时间:
2011-12-20 22:54
你生成之后先判断一下跟上一个值的差是否在5以内,是的话就抛弃,重新生成。
作者:
BAT1
时间:
2011-12-20 23:11
本帖最后由 BAT1 于 2011-12-20 23:22 编辑
回复
2#
awk
假如把这个思路用在 总数为25的数字,假设上次取值为10。那么,下次取值在5至15之间都要抛弃。(11/25 能取的只有 14个值一小半的值都不能用,差不多取25次值,有11次是作废的)
而且,我还要引用这个数值,用上面这个数作平均数,取他的子值,在指定范围内再取三次值,如果有两个数相同或者相差为1就抛弃。
那么估算下来,将会有百分之八十的取值会被作废。代码的无效运行次数将会大大增加。
能否想个比这个方法要高效一点的?比如,在第二次取值时直接排除掉跟第一个数字邻近的那几个数字。第三次取值时,只排除掉第一次所取值正负1以内的数字,以及相对于第二次的指定范围的数字。
作者:
awk
时间:
2011-12-20 23:24
回复
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来决定从第几组里面取下一个数据。
作者:
BAT1
时间:
2011-12-21 00:01
这个思路我先试一试,应该可以搞定了。
作者:
yyykkkyyyy
时间:
2011-12-21 08:20
我看分5组也不能排除得了某组上限与下一组下限依然差值太小的可能
彻底避免不合格值的方法可以每取一个值后才计算不合格值范围,从总范围内排除后再从中取随机值,虽然麻烦,但绝对有效
作者:
awk
时间:
2011-12-21 10:50
回复
6#
yyykkkyyyy
再仔细看看4楼这个:
X=(X+2)%5+1
作者:
yyykkkyyyy
时间:
2011-12-21 12:59
回复 yyykkkyyyy
再仔细看看4楼这个:
X=(X+2)%5+1
awk 发表于 2011-12-21 10:50
确实我没仔细看,也没必要细看,因为只要说是分组,如果与前次的组相邻的组不排除,就是我在6楼说的情况,如果也要排除相邻组相当于仅从 2~3 组里取值了,显然又过多地排除了,似乎于随机的概率上也不合适,除非说相邻组里也会视情况取一部分,那就和我说的没区别了,只是方法上更具体。
不管是哪种,其实总的思路你我是相同的,就是要从取随机范围里把不合要求的先排除了去取随机值,而不是取了值后判断是否合适。
说实话,楼主的完整要求我都还没看明白,似乎并不在意有相近的值,只是要控制概率不要大了,他自己也会写这代码,也许你提供的思路正是他所需要的
作者:
netbenton
时间:
2011-12-21 16:26
a=!random!%25+1
b=(a+5+!random!%8)%25+1
作者:
bluewing009
时间:
2011-12-21 21:01
我先问问,是不是这样:
假如数是14,那么下一个取值是1~9或19~25?
作者:
bluewing009
时间:
2011-12-21 21:13
标题:
标题
本帖最后由 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
作者:
bluewing009
时间:
2011-12-21 21:14
本帖最后由 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
作者:
yyykkkyyyy
时间:
2011-12-21 22:14
本来可能楼主已经有答案了,随机的事嘛也没必要太认真。但看到9楼答的,又想说两句,确实是简捷高效,我没这么具体量化,其实也有过思考,如果老是下一个数往+的方向加的话似乎也不够随机——总是往“递增”方向发展,过限回头继续。还想过可以另取随机值仅决定+- , 但是看到楼主似乎要求不相邻的数里也不允许重复,并在强调概率范围,又还有些话的意思没太明白就没细想了
作者:
cjiabing
时间:
2011-12-21 22:59
又是数学,考思维,好好练吧,我数学最差了。
作者:
awk
时间:
2011-12-21 23:04
楼主正在闷头写代码呢哈哈
欢迎光临 批处理之家 (http://bathome.net./)
Powered by Discuz! 7.2