当前位置:编程学习 > VB >>

VB数据处理高手来帮下忙

在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
Randomize

Dim 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)
Loop

N = 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高手来啊! 制作杀毒软件监测

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,