各位朋友 帮帮忙 急用 !!!

奋斗的小楞楞 2008-10-22 11:53:23
编写一个程序由计算机产生中奖号,界面如下:

范围:
号码个数:
这一期的中奖号码为:
开奖 退出
功能要求:
(1) 中奖号码的范围用户可以自由设定,起始值默认为0,用户只需设置最大值。
(2) 产生的中奖号码中,数字不允许重复,如中奖号码中的第二个数字为2,则号码的后面所有号码中不允许再出现2,即需要保证最后产生的中奖号码不允许有重复号码出现。
提示:
(1) 结合FOR循环、数组和动态数组的使用方法考虑问题。
(2) 用一个动态数组保存产生的最终号码,每随机产生一个数字,都去与之前的所有数字进行挨个比较。最后一次性输出动态数组中的所有数字。

...全文
91 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fvflove 2008-10-24
  • 打赏
  • 举报
回复
(1) 结合FOR循环、数组和动态数组的使用方法考虑问题。
(2) 用一个动态数组保存产生的最终号码,每随机产生一个数字,都去与之前的所有数字进行挨个比较。最后一次性输出动态数组中的所有数字。


如果是每产生一个数据都去比较.再产生,再比较..那多慢.

如果是 1000 选 999 不知要运行多久/

以下算法解决了此难点.

选多少个就循环多少次.


Option Explicit

'Text1 保存的是中奖号码的范围 最大值
'Text2 保存的是要产生的中奖号码的个数

Private Data() As Long '用于保存随机生成的数据
Private mMax As Long '中奖号码的范围 最大值
Private mCount As Long '产生的中奖号码的个数

Private newCol As New Collection '生成一个容器,用于保存 中奖号码的范围 数据集合

Private Sub Command1_Click() '生成数据命令
mMax = Val(Text1.Text)
mCount = Val(Text2.Text)

' 判断数据的有效性
If mCount > mMax Then '产生的中奖号码的个数 不能大于 中奖号码的范围 最大值
Exit Sub
End If

If mCount < 1 Or mMax < 1 Then '产生的中奖号码的个数 与 中奖号码的范围 最大值 均不能小于 1
Exit Sub
End If


Dim i As Long

For i = 1 To mMax
newCol.Add i '将数据1 至 最大值 (即中奖号数据集合)放入容器中
Next


ReDim Data(1 To mCount) As Long '重新定义数组,用于保存数据

Dim newRnd As Long '保存产生的随机数。

'好处,只循环取得数据总数的次数。
For i = 0 To mCount - 1
newRnd = Rnd(1) * (mMax - i) + 1 '产生1至 mMax-i 之间的随机数 '因每产生一个数据,集合中就少一位,所以用 mMax-i

Data(i + 1) = newCol.Item(newRnd) '保存随机数(取得中奖号码集合中的数据)

newCol.Remove newRnd '此处,从中奖集合中删除此产生的数据' 避免重复产生数据.
Next

For i = 1 To mCount
MsgBox Data(i) '看一下数据
Next

End Sub
jhone99 2008-10-24
  • 打赏
  • 举报
回复
Private Sub Command1_Click()
Dim i As Integer
Dim intA() As Integer

If Not IsNumeric(Text1.Text) Then
MsgBox "请输入数字"
Exit Sub
End If

If Not IsNumeric(Text2.Text) Then
MsgBox "请输入数字"
Exit Sub
End If

ReDim intA(Val(Text2.Text))

For i = 0 To Val(Text2.Text) - 1
intA(i) = f_Get(i, intA())

Next i

For i = 0 To Val(Text2.Text) - 1
Print intA(i)

Next i



End Sub


Private Function f_Get(ByVal intOrder As Integer, ByRef intArray() As Integer) As Integer
Dim j As Integer
Dim m_Num As Integer

m_Num = Int((Val(Text1.Text) + 1) * Rnd)

If intOrder > 0 Then
For j = 0 To intOrder - 1
If intArray(j) = m_Num Then
m_Num = f_Get(intOrder, intArray())
Exit For
End If
Next j
End If

f_Get = m_Num
End Function


奋斗的小楞楞 2008-10-24
  • 打赏
  • 举报
回复
谢谢大家!!!
jhone99 2008-10-24
  • 打赏
  • 举报
回复
在使用rnd之前加上Randomize才能产生真正的随机数



Private Sub Command1_Click()
Dim i As Integer
Randomize

Dim a(1 To 9) As Integer

For i = 1 To 9
a(i) = Int(Rnd * (10 ^ 2))
Print a(i)
Next i

End Sub
herolibo 2008-10-23
  • 打赏
  • 举报
回复
你的提示2不好,当你的最大值很大时,产生到最后几位,会占用很多资源。不推荐这种算法
奋斗的小楞楞 2008-10-23
  • 打赏
  • 举报
回复
不用考虑这么多 就按要求便就行 怎么编呀 急用

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧