找回密码
 加入
搜索
查看: 4392|回复: 8

[AU3基础] 一组随机数的生成,具体条件见帖子

  [复制链接]
发表于 2010-8-28 22:24:25 | 显示全部楼层 |阅读模式
本帖最后由 ice20040919 于 2010-8-29 10:08 编辑

有一组随机的数,已经知道他们的累加和,公差是不确定的随机的,这个算法该怎么写呢,我已经想了3天了,没解决,求高人指点。
举个例子说明下:__、__、__、__、__、__、__、__、__、__、__、41
                       这11个数依次从左至右递增,公差是3or4,它们的总和是41;这组数怎么生成
补充:41是个设定常量,可根据需要改变


这组递增的随机数,该怎样生成呢,希望高人指点,不要见笑!


更正:这组数共11项,正整数,可以当做是俩个等差数列d1=3和d2=4的随机组合,但是需要这组数要是递增的。
      累加和是固定的,只不过我写的是41,也可以是别的正整数。
发表于 2010-8-28 23:00:30 | 显示全部楼层
本帖最后由 foboy 于 2010-8-29 10:49 编辑

这个函数可以满足你的需求,算出来,每个数之间的差可能是3或者4,不是一个等差数列,结果输出的顺序是从大到小。
例子中是求3个和为16的数。
如果要求11个和为41的数, 可以运行:test(41,11)
不过这样算是没有结果的。
 
test(16, 3)
Func test($sum, $num_num)
 For $_i = 0 To $sum
  If $_i * $num_num + $num_num * ($num_num - 1) * 1.5 > $sum Then ExitLoop
  $_result = check($_i, $sum, $num_num)
  If Not @error Then
   ConsoleWrite($_result & @CRLF & $_i & @CRLF & "**********"&@CRLF)
  EndIf
 Next
EndFunc   ;==>test

Func check($now_num, $sum, $num_count, $now_sum = -1, $now_count = 1)
 If $now_sum == -1 Then $now_sum = $now_num
 $now_num += 3
 If $now_num > $sum Then Return SetError(1, 0, "")
 $now_count += 1
 $now_sum += $now_num
 If $now_sum == $sum And $now_count == $num_count Then Return $now_num
 $_result = check($now_num, $sum, $num_count, $now_sum, $now_count)
 If Not @error Then
  ConsoleWrite($_result & @CRLF)
  Return $now_num
 EndIf
 If $now_sum + 1 == $sum And $now_count == $num_count Then Return $now_num + 1
 $_result = check($now_num + 1, $sum, $num_count, $now_sum + 1, $now_count)
 If Not @error Then
  ConsoleWrite($_result & @CRLF)
  Return $now_num + 1
 EndIf
 Return SetError(1, 0, "")
EndFunc   ;==>check

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

发表于 2010-8-28 23:10:52 | 显示全部楼层
汗了

弱弱地问下,公差是怎么算出来 的?

学过的东西都还给老师了
发表于 2010-8-29 00:47:03 | 显示全部楼层
的确很头痛啊。不过楼主的题好像有点问题啊。
把41为和换成44试试。
#include <array.au3>
MsgBox(0,0,_test(55,11))

Func _test($sum, $n)
For $k=1 To $sum
                Local $chu = $sum
        Local $num[$n],$resul
        Do
                $he = $chu
                Local $jei = 0
                For $i = 0 To $n - 1
                        $he = $he - $k
                        $num[$i] = $he
                        $jei += $num[$i]
                Next
                ConsoleWrite($jei & @CRLF)
                $chu -= 1
                If $jei<$sum Then ExitLoop
        Until $jei = $sum
        If Execute(_ArrayToString($num,"+"))=$sum Then 
        $resul&="$a="&_ArrayToString($num,",")&"    $b="&$k&@CRLF
        EndIf
Next
Return $resul
EndFunc   ;==>_test

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

 楼主| 发表于 2010-8-29 08:37:39 | 显示全部楼层
回复 2# foboy

多谢了,确实没有11个正整数的等差数列和等于41。确实只要正整数就好了。
难点就在于这不是等差数列,只不过是递增的。或者说,可以看做是公差为3和公差为4的俩组等差数列,他们之间的项是随机搭配的,除了递增关系没有规律性。
发表于 2010-8-29 09:47:26 | 显示全部楼层
回复 5# ice20040919
上了公差这个词的当了
发表于 2010-8-29 09:49:28 | 显示全部楼层
不小心看成,公差是3or4,公差的总和是41
理解錯誤,產生錯誤的代碼...
#Include <Array.au3>
Local Const $End=41,$x=3,$y=4,$n=11
If $x>$y Then Exit

Local $ans[$n+2]=[$n+1]
Local $yn=($end-$x*$n)/($y-$x),$xn=$n-$yn
If Not IsInt($xn) Or $yn<0 Then Exit

Local $i=$n,$pos,$log=","
SRandom(@MSEC)
While $yn>0
        $pos=Int(Random()*$n)+1
        If StringInStr($log,","&$pos&",") Then ContinueLoop
        $log&=$pos&","
        $ans[$pos]-=($y-$x)
        $yn-=1
WEnd

$ans[$n+1]=$end
While $i>0
        $ans[$i]+=$ans[$i+1]-$x
        $i-=1
WEnd

        _ArrayDisplay($ans,"By Duvet")
Exit
 楼主| 发表于 2010-8-29 09:52:48 | 显示全部楼层
回复 7# Duvet
不好意思啊,我没有表达清楚,谢谢各位的热心朋友!
 楼主| 发表于 2010-8-30 09:23:39 | 显示全部楼层
回复 2# foboy


    谢谢,解决我的大问题啦
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-6-3 08:15 , Processed in 0.084330 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表