求教生成不重复的随机数
vb吧
全部回复
仅看楼主
level 3
杨小平25 楼主
请问怎么在文本框中生成不重复的随机数啊,用randomize生成的是重复的数还是不重复?
2020年09月13日 05点09分 1
level 15
Randomize的作用是使程序每次运行时产生的随机数序列都不相同,比如第一次运行产生的是1、2、3……,下次再运行时产生的则是4、5、6……,如果不用Randomize则每次产生的都是1、2、3……
如果要产生不重复的随机数序列,可以有两种方法:
1.用数组保存每个已产生的随机数,当再次产生一个随机数时,与数组中已有的数字进行比较,如果已经出现过,则舍弃新产生的数,重新产生一个
2.把目标范围内所有的数字全部打乱顺序,然后按照打乱之后的顺序依次取出每个数,具体的打乱方法可以是:循环过一遍数组,把每个数都跟数组内随机位置的一个数交换一次位置
2020年09月13日 05点09分 2
多谢,请问能用代码演示一番吗
2020年09月13日 06点09分
吧务
level 13
' 生成 20 个 10 到 n 之间的随机数
Dim n As Integer, S(1 To 20) As Integer
n = Val(InputBox("随机数的最大数 n", "输入n", "60"))
Randomize
Picture1.Cls
s(1) = Int((n - 9) * Rnd + 10)
For i = 2 To 20
s(i) = Int((n - 9) * Rnd + 10)
For j = 1 To i - 1 ' 判断随机数是否重复
If s(i) = s(j) Then i = i - 1
Next
Next
2020年09月13日 07点09分 4
LZ 的命题没有给出随机数的范围和个数,所以无法编程。对于【Randomize】只能是尽可能不重复,并没有绝对不重复的功能,特别是范围小、随机数的个数多的情况。
2020年09月13日 07点09分
对于【范围小、随机数的个数多的情况】最好是使用【随机乱序法】。例如机考抽题后,就要进行【随机乱序】处理。
2020年09月13日 07点09分
【Picture1.Cls】这一句是没有用的。原来是要把随机数放入一个【图形框】中,所以有这一句。
2020年09月13日 07点09分
还是罗老师讲得透彻[大拇指]
2020年09月15日 13点09分
吧务
level 13
生成不重复的随机数,主要是内循环的判断,可以一行搞定:
For j = 1 To i - 1: If s(i) = s(j) Then i = i - 1: j = i: Next
2020年09月16日 00点09分 6
这种写法在VB语法中是错误的,因为If的单行形式会将Then后面的所有语句判定为属于If语句的一部分,从而报错“Next没有For”;在有If的场合,不能随便用冒号代替换行,建议还是老老实实地分行写代码比较好
2020年09月16日 01点09分
是的。我做了实验,For …… Next 中嵌入 If 语句,就加上【: End If】也有问题。这真的值得注意。
2020年09月17日 03点09分
有关代码请看九楼。
2020年09月17日 03点09分
吧务
level 13
' 有20个人,每人手中持有一张票,票号的范围是76~95,
' 现在要随机抽出10个人来领奖品,
' 以每行五个号的格式,显示出这10个人的票号。
' 对于范围小,随机数多的情况,就要使用【随机乱序】方法:
Dim S(1 To 20) As Integer, cc As String
Dim i As Integer, j As Integer, T As Integer
' 将数据装入数组
For i = 1 To 20: S(i) = 95 - i: Next
Randomize
For i = 1 To 20 ' 随机乱序
j = Int(Rnd * 10 + 1)
T = S(i): S(i) = S(j): S(j) = T
Next
cc = "抽出的票号是:" & vbCrLf
For i = 1 To 10
cc = cc & CSt(S(i))
If i Mod 5 = 0 Then
cc = cc & vbCrLf
Else
cc = cc & Space(5)
End If
Next
MsgBox cc, 0 + 64, "输出结果"
2020年09月16日 01点09分 7
【For i = 1 To 20: S(i) = 95 - i: Next】应该是【For i = 1 To 20: S(i) = 96 - i: Next】
2020年09月16日 01点09分
【cc = cc & CSt(S(i))】应该是【cc = cc & CStr(S(i))】
2020年09月16日 01点09分
吧务
level 13
2020年09月16日 01点09分 8
1