想得到一个四位的随机数,有没有更好的算法?

gryphon 2003-01-30 04:03:07
我想得到一个四位的并且各位不重复的数字,如1982、3680,我使用下面的算法,得到的结果虽然符合要求,但是数字重复出现的频率太高,如1982、xxxx、xxxx、xxxx、然后又出现了1982。请问各位大侠有没有一个改进的算法解决这个问题?
算法如下:(用VB)
Public key As Single
Public vextec(10) As Boolean
Public result(4) As Integer
Public resultIs(4) As Boolean
Public Function getNum()
Dim temp As Single
Dim curKey As Integer
Randomize
curKey = Int(10 * Rnd)
getNum = curKey
End Function

Public Sub getResult()
Dim i As Integer
Dim tmpKey As Integer
For i = 1 To 4
resultIs(i) = False
Next i
For i = 1 To 10
vextec(i) = False
Next i
For i = 1 To 4
While resultIs(i) = False
tmpKey = getNum()
If vextec(tmpKey) = False Then
result(i) = tmpKey
resultIs(i) = True
vextec(tmpKey) = True
End If
Wend
Next i
End Sub
...全文
162 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
13161795500 2003-02-08
  • 打赏
  • 举报
回复
以上答案全部错误!
nik_Amis 2003-02-08
  • 打赏
  • 举报
回复
你的意思是1982出现后,所有的四位数都出现过了猜可以重新出现1982?
dengwei007 2003-02-08
  • 打赏
  • 举报
回复
使用randomize后,rnd产生的值本来就是由时间种子产生的,
之所以数据不够随机,完全是由你的算法决定的。
你可以算一下概率嘛,看看你那样的算法出现2个1982的概率有多大?
northwolves 2003-01-30
  • 打赏
  • 举报
回复
兄弟刚写了一段代码,你试试:


Private Sub Command1_Click() '查看效果
For i = 0 To 9
List1.AddItem rndnum(4)
Next
End Sub

Function rndnum(ByVal n As Integer) As String '随机生成一个n位无重复数字(n<=9)
If n < 2 Or n > 9 Then Exit Function
Static x As New Collection, temp As Integer, i As Integer
For i = 0 To 9
x.Add i
Next
Randomize
temp = 2 + Int(Rnd * 9)
rndnum = x.Item(temp)
x.Remove temp
For i = 2 To n
temp = 1 + Int(Rnd * (x.Count - 1))
rndnum = rndnum & x.Item(temp)
x.Remove temp
Next
Set x = Nothing
End Function
tdjpal 2003-01-30
  • 打赏
  • 举报
回复
我还是觉得于时间为种子比较好!个人意见!

我什么都不懂,请大家多多关照!谢谢
dengyin2000 2003-01-30
  • 打赏
  • 举报
回复
rnd*10000+rnd*1000+rnd*100+rnd*10
yanzeyuan 2003-01-30
  • 打赏
  • 举报
回复
rnd随机数发生器本来就存在很大问题!
gryphon 2003-01-30
  • 打赏
  • 举报
回复
其实符合要求的四位数我已经做出来了,只是如果产生的次数稍稍多一些,就会又出现重复的数字,比如说第一次产生1982,连续几次产生别的数字后,又产生了1982。我希望是这样,除非产生足够多的次数,否则不会有重复出现的数字。
我想这是不是和RND的随机数序列有关?请赐教
ZhangYv 2003-01-30
  • 打赏
  • 举报
回复
自己做呗,取数的过程是这样的:
Rarray[i] = i(i = from 0 to 9)

index = Random(Last);
Rnd = Rarray[index];
Swap(Rarray[index],Rarray[Last]);
Last := Last-1;
northwolves 2003-01-30
  • 打赏
  • 举报
回复
把所有满足条件的四位数置入一个集合或数组,用时随机取一个。
stwx 2003-01-30
  • 打赏
  • 举报
回复
产生四位随机数,再让它与yy-mm-dd hh:mm:ss 一起进行运算(如何运算自己决定),就可再得出四位数.
WuYunpeng 2003-01-30
  • 打赏
  • 举报
回复
dim Number as integer
randomize timer
number=(int(rnd * 9)+1)*1000
number=number + int(rnd *10)*100
number=number + int(rnd *10)*10
number=number + int(rnd *10)
msgbox number
yanzeyuan 2003-01-30
  • 打赏
  • 举报
回复
如果你没有用时间作为随机种子

你想,当你的第一位随机数一旦确定,那么按照随机算法

你的后三位数也定了

所以,我建议采用时间作为随机种子

并且用一个循环做检查

如果生成的数字与前面数字重复,则继续随机产生!

初来乍到,不懂事,请赐教

minajo21 2003-01-30
  • 打赏
  • 举报
回复
不明白,直接这样不行吗?
Int((9999- 1+ 1) * Rnd + 1)
tdjpal 2003-01-30
  • 打赏
  • 举报
回复
我的另类想法:一个timer控件,对时间进行某种算法!
第一次来,不懂事,不要见怪!谢谢!
smartluwei 2003-01-30
  • 打赏
  • 举报
回复
判断第4位的数字,如果有相同的,就再去做一次循环啊
gang75 2003-01-30
  • 打赏
  • 举报
回复
gz

7,759

社区成员

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

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