VB数据处理高手来帮下忙
在Text1随便输入一个200到10000的数字,有办法让vb一直生成随机数,随机数相加的和在等于Text1的时候结束,而产生的随机数最大在50左右,保留一位小数,上下两组数之差不大于4,且前一数比下一个数大。有朋友愿意帮忙想想吗,不好意思,手机提的问,分给不高,不过帮人也不全看分,是吧?
追问:来自手机问问谢谢你们了,用自己的方式写好了,还很符合要求,谢谢你的帮忙,希望以后还能得到你的帮忙
在Text1随便输入一个200到10000的数字,有办法让vb一直生成随机数,随机数相加的和在等于Text1的时候结束,而产生的随机数最大在50左右,保留一位小数,上下两组数之差不大于4,且前一数比下一个数大。有朋友愿意帮忙想想吗,不好意思,手机提的问,分给不高,不过帮人也不全看分,是吧?
追问:来自手机问问谢谢你们了,用自己的方式写好了,还很符合要求,谢谢你的帮忙,希望以后还能得到你的帮忙
答案:呵呵,好多位小数是碰到VB中Double类型本身的BUG了。没事做了个,看看行不。
控件:Text1、Text2、Label1、Label2、Command1、List1
布局:
代码:
Option Explicit
Dim YY As Integer
Private Sub Command1_Click()
Dim H As Double, S As Double, L As Double, T As Double, N As Double
Dim Y As Boolean
Y = False
S = Val(Text2.Text)
T = Val(Text1.Text)
List1.Clear
List1.AddItem Format(S, "0.0") & vbTab & "0.0" & vbTab & Format(S, "0.0") '显示产生随机数、与上一数的差值、当前加和
Randomize
H = S
N = S * 500 / T '随机数产生范围控制,防止出现负值
If N >= 40 Then N = 40 '上下两组数之差不大于4
If N < 10 Then N = 10
Do While H < T
L = Int(N * Rnd) / 10 + 0.1 '随机数要大于0
S = S - L
S = Int(S * 10) / 10 '消除VB双精度数本身的0.xxxxx……问题
If S < 0 Then '控制程序意外产生负值时结束循环
Y = True
Exit Do
End If
H = H + S
H = Int(H * 10) / 10 '消除VB双精度数本身的0.xxxxx……问题
List1.AddItem Format(S, "0.0") & vbTab & Format(L, "0.0") & vbTab & Format(H, "0.0") '保留一位小数
Loop
If Y Then '程序意外产生负值时
YY = YY + 1
If YY > 10 Then '尝试10次均失败,则结束程序。
MsgBox "“和”太大而“随机数最大”太小,无法完成!"
YY = 0 '清除尝试次数,以便其它计算。
Exit Sub
End If
Command1_Click '控制丢弃所有数据,尝试再次计算
End If
End Sub
Private Sub Form_Load()
YY = 0
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer) '输入和值
Select Case KeyAscii
Case 8, 48 To 57 '退格键、数字键不受限制:8为退格键、48~57为数字键
Case 46 '46为“.”键
If InStr(Text1.Text, ".") > 0 Then KeyAscii = 0 '限制后面再重复输入“.”号
Case Else '其余的键全受限制
KeyAscii = 0
End Select
End Sub
Private Sub Text2_KeyPress(KeyAscii As Integer) '输入最大随机数
Select Case KeyAscii
Case 8, 48 To 57 '退格键、数字键不受限制:8为退格键、48~57为数字键
Case 46 '46为“.”键
If InStr(Text1.Text, ".") > 0 Then KeyAscii = 0 '限制后面再重复输入“.”号
Case Else '其余的键全受限制
KeyAscii = 0
End Select
End Sub
要想正好等于的话,是很困难的,但大于还是比较容易的.
Option Explicit
Private Sub Command1_Click()
Dim X() As Double
Dim S1 As Integer, N As Integer, S2 As Integer
S1 = Val(Text1.Text) * 10
RandomizeDim U As Integer, L As Integer
N = 1
ReDim X(N)
X(1) = Int((540 - 460 + 1) * Rnd + 460)
S2 = X(1)Do While S2 + X(N) < S1
N = N + 1
ReDim Preserve X(N)
U = X(N - 1)
L = X(N - 1) - 40
X(N) = Int((U - L + 1) * Rnd + L)
S2 = S2 + X(N)
LoopN = N + 1
ReDim Preserve X(N)
X(N) = S1 - S2
Dim strT As String, I As Integer
For I = 1 To N
strT = strT & X(I) / 10 & ";"
Next
Text2.Text = strT
End Sub不是我不想帮你,大哥,你自己看看你的问题,你都搞不懂既然text1随便输入一个200到10000的数字,你为什么还让产生的随机数最大在20左右。你能把问题明确吗?不好意思,没接触过VB,希望不会介意我来回答。
不过思路应该可以的。
搜了一下VB有个rnd能够随机生成 [0,1)区间的小数。
int max = 60; // 60以内。
int text = 1888; // 这里你用Text1的输入。
int count=0;
int tmp;
while(count<text){
tmp=int(60*rnd); //把随机生成的转换成整数。
count+=tmp; //
print tmp; // 打印出tmp,不知道VB是怎么打印的。
}
dim nums(50) as double
dim t as double
dim total as double
dim i as integer
dim j as integer
total=0
t=cdbl(rnd*(10000-200)+1)
nums(0)=t
For i=1 to 49
num(i)=cdbl(rnd*(num(i-1)+4-num(i-1))+1)
For j=0 to i
total=total+num(j)
if total>=cdbl(txtbox1.text)
Exit For
end if
Next j
Next i
For j=0 to i
print num(j)
Next j
上一个:VB写俄罗斯方块!VB 高手进。
下一个:VB高手来啊! 制作杀毒软件监测