xiehuahere 发表于 2011-10-30 20:56:55

【已解决】如何使随机数分布更随机,且限制其“累加和”在一个范围内

本帖最后由 xiehuahere 于 2011-10-31 14:20 编辑

拜读了P版关于随机数的精辟论述 - 这里
自己练习一下:#Include <Date.au3>
$max = 500
Dim $rand
SRandom(_Date_Time_GetTickCount())
For $i = 0 To 9
        If $i = 0 Then
                $rand = Random(0, $max, 1)
        Else
                $max -= $rand[$i-1]
                $rand[$i] = Random(0, $max, 1)
        EndIf
        ConsoleWrite($rand[$i] & " ")
Next多次运行可以看出,基本上大数都集中在前面几个数字,后面的数字经常就是0。
如何使得分布更随机呢?
不一定要平均分布,而是说,使得前面出现大数和后面出现大数的概率一样高(数学没学好啊,不知道说明白了没)。
PS: 根据4#提供的方法增加了au3代码的语法颜色显示。

xms77 发表于 2011-10-30 21:03:37

为什么一定要颜色显示?我到现在还没有学会呢!

黑色袜子 发表于 2011-10-31 02:15:12

看了P版的那个。我也受教了。

drunk 发表于 2011-10-31 09:46:34

本帖最后由 drunk 于 2011-10-31 09:48 编辑

"代码"这样就会高亮显示了

3mile 发表于 2011-10-31 09:48:48

第9行是什么意思?

xiehuahere 发表于 2011-10-31 09:56:25

本帖最后由 xiehuahere 于 2011-10-31 10:00 编辑

回复 5# 3mile


    为了保证“累加和”限制在500以内,每生成一个随机数,就减去这个数字,用剩下的作为最大值来生成下一个随机数。
   比如,第一个随机数范围rand范围在,第二个rand范围就是]。。。这样就能保证10个随机数的“累加和”不超过500。

   这个方法必然会导致后面的随机数越来越小。就是想请教有没有其他方法,能保证“累加和”的限制,又能使得出现大数的概率较为平均。

xiehuahere 发表于 2011-10-31 10:05:08

回复 4# drunk

谢谢,了解了。

3mile 发表于 2011-10-31 11:02:22

回复 6# xiehuahere
如果最大数不能大于500的话,最平均的分部应该是50*10.也就是说,如果前面任意出现一个比较大的随机数的话(比如251)将直接导致数字池中可以使用的数字减少,所以会出现1楼中数据越来越小,直致无限接近或等于0.
以下代码只是一个变通,逻辑较简单。
#Include <Date.au3>
#include <array.au3>

$max = 50
Dim $rand
SRandom(_Date_Time_GetTickCount())
$rand=Random(0,$max,1)
$temp=$rand
For $i = 1 To 9               
        $max=Int((500-$temp)/(10-$i))
        ConsoleWrite($max&@TAB&$temp&@CRLF)
    $rand[$i] = Random(0, $max, 1)
        $temp+=$rand[$i]
Next

Local $add

For $i=0 To UBound($rand)-1
        $add+=$rand[$i]
Next
_ArrayDisplay($rand,"结果:"&$add)

netegg 发表于 2011-10-31 12:45:50

回复 5# 3mile

原始值按原始值减某一值自更新

xiehuahere 发表于 2011-10-31 12:49:26

回复 8# 3mile

谢谢!比我那个效果好些。
但这样也就限制了一开始的数据不能很大(而这样的限制是不想要的)。
我的想法是,能不能不要按部就班地从0-9依次分配,如果这个分配的顺序也是随机的,那就可以彻底解决这个问题。

3mile 发表于 2011-10-31 13:14:29

回复 10# xiehuahere
从15行起增加以下代码乱充数组:For $i=1 To UBound($rand)*2
        _ArraySwap($rand, $rand)
Next

xiehuahere 发表于 2011-10-31 14:18:45

回复 11# 3mile


   先生成数组,然后再打乱。    厉害,我怎么就没想到呢!
   思维定势害死人。
   搞定,多谢!

liqihont 发表于 2012-9-21 23:09:31

有点笨不太理解累加什么意思,要让随机数更随机有个思路。例如要得到1-10的随机数:random(1,1000)/100然后取整数。

liqihont 发表于 2012-9-21 23:09:35

有点笨不太理解累加什么意思,要让随机数更随机有个思路。例如要得到1-10的随机数:random(1,1000)/100然后取整数。

chamlien 发表于 2016-5-31 20:47:14

回复 14# liqihont

这个其实也做不到更加随机
页: [1]
查看完整版本: 【已解决】如何使随机数分布更随机,且限制其“累加和”在一个范围内