ice20040919 发表于 2010-8-28 22:24:25

一组随机数的生成,具体条件见帖子

本帖最后由 ice20040919 于 2010-8-29 10:08 编辑

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


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


更正:这组数共11项,正整数,可以当做是俩个等差数列d1=3和d2=4的随机组合,但是需要这组数要是递增的。
      累加和是固定的,只不过我写的是41,也可以是别的正整数。

foboy 发表于 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

xyold1 发表于 2010-8-28 23:10:52

汗了

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

学过的东西都还给老师了

3mile 发表于 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

ice20040919 发表于 2010-8-29 08:37:39

回复 2# foboy

多谢了,确实没有11个正整数的等差数列和等于41。确实只要正整数就好了。
难点就在于这不是等差数列,只不过是递增的。或者说,可以看做是公差为3和公差为4的俩组等差数列,他们之间的项是随机搭配的,除了递增关系没有规律性。

3mile 发表于 2010-8-29 09:47:26

回复 5# ice20040919
上了公差这个词的当了

Duvet 发表于 2010-8-29 09:49:28

不小心看成,公差是3or4,公差的总和是41
理解錯誤,產生錯誤的代碼...{:1_257:}#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

ice20040919 发表于 2010-8-29 09:52:48

回复 7# Duvet
不好意思啊,我没有表达清楚,谢谢各位的热心朋友!

ice20040919 发表于 2010-8-30 09:23:39

回复 2# foboy


    谢谢,解决我的大问题啦
页: [1]
查看完整版本: 一组随机数的生成,具体条件见帖子