求救~~~VB问题急急急~~如何产生随机的n个和为m的正整数,并且生成在自定域???

在excel表上,比如我现在要产生100个和为29700的随机正整数(不可重复),生成的区域在A1:J10这100个格子里,该如何编写????求详细过程,急求!!!!

第1个回答  2011-09-23
其中产生随机数是重点,要用到函数a(i) = Int(f * Rnd()) + 1
代码:
Private Sub Command1_Click()
Dim Application As Object
Dim WorkBook As Object
Dim Sheet As Object
Set Application = CreateObject("Excel.Application") '建立EXCEL对象
Set WorkBook = Application.Workbooks.Add() '建立一个新的Excel文档
Set Sheet = WorkBook.Sheets.Add() '建立一个新表单
Application.Visible = True 'EXCEL使之可见
Cls
x = 5050
y = 29700
k = 100
Dim a(100) As Integer
Do While i < 99
xishu = 100 - i
x = x - xishu
f = Int((y - x) / xishu)
a(i) = Int(f * Rnd()) + 1
y = y - xishu * a(i)
jieguo = jieguo + xishu * a(i)
p = jieguo + y
shuzi = shuzi + a(i)
'Print a(i); xishu; a(i) * xishu; y; jieguo; p; shuzi
g = Int(i / 10) + 1
f = i - (g - 1) * 10 + 1
Sheet.Cells(g, f).Value = shuzi '填写表单的第g行第f列的值
i = i + 1
Loop
Sheet.Cells(10, 10).Value = 29700 - jieguo + shuzi
End Sub
第2个回答  2011-09-22
做个函数,产生随机数
sub fun(a() as integer,n as integer,m as integer)
dim i, s as integer
randomize
redim a(n-1)
for i=0 to n-2
a(i)=int(Rnd*(m-s))
s=s+a(i)
next
a(i)=m-s
end sub

调用:fun 数组名, n, m追问

这个是我的编程,能帮我看看哪里有问题么。。。。我现在运行出来会出现算不下去的情况,还会有负数。。。帮帮我~

追答

能不能贴出来?包括用到的子函数。

第3个回答  2011-09-22
这个你需要一组还是每运行一次,就产生一个不同的组?追问

需要一组~

追答

楼上的思路真的是随机啊,这样的话,计算量很大,而且运气性很强。如果运气差的话,数量又多,会循环好久的。不过还是有优点的,就是真的很随机。

第4个回答  2011-09-22
一定要用VB编写么?其他语言写的可不可以。用DELPHI编可行不。追问

额,就用VB,你说的那个更不会了。。。

追答

既然你懂VB,那我把思路告诉你吧。毕竟术业有专攻,但是思想是可以给予你帮助的,。
先定义一个数量为100的一维数组,然后随机出1到24750中的1个数字,并分别与数组内比对,若相同则抛出,若不同则插入数组中。当数组被填满后。用FOR语句计算数组中所有数字之和,如果不等于29700,则返回,重新生成数组。直至和为29700。则跳出循环。获得一个含有100个数字的1维数组,且数组里数字之和为29700。然后导出EXCEL表中,每导10行在EXCEL中换行。结束。
你可能会奇怪为什么随机1到24750中的数字,因为要100个不同数字,最差情况可能是1、2、3、4、……、99、24750,如果你有任何数字大于24750则得到的和必大于27900.因此随机出的数最大为24750.
以上是做这个程序思想。如果看不懂,可以拆分开来,一步一步实现。

第5个回答  2011-09-23
解题思路:
将这一百个整数按从小到大排列,第一个数为A0,第二个数比第一数大A1,第三个数比第二个数大A2,以此类推,第100个数比第99个数大A99,那么这100个整数之和可表达为:100*A0+99*A1+......+2A98+A99=29700
这100个数不重复,说明A(i)>0,进一步说明99*A1+......+2A98+A99这一部分大于或等于4950,同时说明100*A0<29700-4950,这样就可以确定A0的取值范围,然后在取值范围内取随机数。
通过随机数确定了A0后,用同样的方法就可以确定后面的A1、A2。
程序实现代码:

Private Sub Command1_Click()
Dim Application As Object
Dim WorkBook As Object
Dim Sheet As Object

Set Application = CreateObject("Excel.Application") '建立EXCEL对象
Set WorkBook = Application.Workbooks.Add() '建立一个新的Excel文档
Set Sheet = WorkBook.Sheets.Add() '建立一个新表单
Application.Visible = True 'EXCEL使之可见

Cls
x = 5050
y = 29700
k = 100

Dim a(100) As Integer
Do While i < 99
xishu = 100 - i
x = x - xishu
f = Int((y - x) / xishu)
a(i) = Int(f * Rnd()) + 1

y = y - xishu * a(i)

jieguo = jieguo + xishu * a(i)

p = jieguo + y

shuzi = shuzi + a(i)

'Print a(i); xishu; a(i) * xishu; y; jieguo; p; shuzi

g = Int(i / 10) + 1
f = i - (g - 1) * 10 + 1

Sheet.Cells(g, f).Value = shuzi '填写表单的第g行第f列的值

i = i + 1

Loop
Sheet.Cells(10, 10).Value = 29700 - jieguo + shuzi

End Sub

如有疑问,问我 QQ:105651183本回答被提问者采纳
相似回答