设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 4480|回复: 17
打印 上一主题 下一主题

[其它] 随机数存在重复的问题

[复制链接]
跳转到指定楼层
1#
发表于 2006-5-27 00:58:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
生成随机8位数,位于1-49之间

可是不能保证8个数字没有重复的

这如何解决呢?谢谢!



Private Sub cmdspin_Click()
Randomize
Dim MyNumber(7) As Integer

MyNumber(0) = Int((49 * Rnd) + 1)
MyNumber(1) = Int((49 * Rnd) + 1)
MyNumber(2) = Int((49 * Rnd) + 1)
MyNumber(3) = Int((49 * Rnd) + 1)
MyNumber(4) = Int((49 * Rnd) + 1)
MyNumber(5) = Int((49 * Rnd) + 1)
MyNumber(6) = Int((49 * Rnd) + 1)
MyNumber(7) = Int((49 * Rnd) + 1)

num.Value = MyNumber(0) & "," & MyNumber(1) & "," & MyNumber(2) & "," & MyNumber(3) & "," & MyNumber(4) & "," & MyNumber(5) & "," & MyNumber(6) & "," & MyNumber(7)

End Sub

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2006-5-27 01:03:00 | 只看该作者
呵呵,六合彩码?
3#
发表于 2006-5-27 01:23:00 | 只看该作者
每次产生的随机数要和先前的数字对比一下,如果重复,就继续产出新的随机数。
4#
 楼主| 发表于 2006-5-27 01:35:00 | 只看该作者
是用IF写吗?

如果这样的话

那第8个数岂不是要和前7个都要比?
5#
发表于 2006-5-27 03:40:00 | 只看该作者
以下是引用webgenius在2006-5-26 17:35:00的发言:


是用IF写吗?

如果这样的话

那第8个数岂不是要和前7个都要比?



没错!

或者:

先生成一张表,48个数字填上,

***在记录总数里生成一个随机数,做为记录位置,记下这个数,删除这个记录,

再下一次操作(回到***号处,共做8次)

这样不会出现重复数,不必比较
6#
发表于 2006-5-27 05:01:00 | 只看该作者
我假定数组只有三个元素(8个元素你可以增加些代码),比较死的办法,你看看是否可以:

Public Sub rnd_integer()
Randomize
Dim MyNumber(3) As Integer


MyNumber(0) = Int((49 * Rnd) + 1)

line100: MyNumber(1) = Int((49 * Rnd) + 1)
If MyNumber(1) = MyNumber(0) Then
MsgBox "goto100"
GoTo line100
End If

line200: MyNumber(2) = Int((49 * Rnd) + 1)
If MyNumber(2) = MyNumber(1) Or _
MyNumber(2) = MyNumber(0) Then
MsgBox "goto200"
GoTo line200
End If


line300: MyNumber(3) = Int((49 * Rnd) + 1)

If MyNumber(3) = MyNumber(2) Or _
MyNumber(3) = MyNumber(1) Or _
MyNumber(3) = MyNumber(0) Then
MsgBox "goto300"
GoTo line300
End If


'num.Value = MyNumber(0) & "," & MyNumber(1) & "," & MyNumber(2) & "," & MyNumber(3) & "," & MyNumber(4) & "," & MyNumber(5) & "," & MyNumber(6) & "," & MyNumber(7)
For i = 0 To 3
Debug.Print MyNumber(i)
Next

End Sub

另外:把数组产生的数据存入某个表中,也可以使用dao或者ado的方法,向下循环,发现重复值就重新产生或者编辑后写入表。

这个方法应该更好一些。


[此贴子已经被作者于2006-5-26 23:34:08编辑过]

7#
发表于 2006-5-27 07:36:00 | 只看该作者
感觉6楼我给出的方法很死,并且如果元素很多,速度将会很慢,代码也很多。

=====================================

所以,还是换了一个方法来做:(元素很多的话,增大循环的终止值就可以了)。我还没有严格测试。看看如何?

感觉还是有些麻烦了,简单的方法还没想出来。

=================================

'产生随机数前,删除表 "table1"中的所有记录
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE table1.ID  FROM table1  WHERE (((table1.ID)<>0));  ", -1

Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb()
Set rs = db.openrecordset("select * from table1")

Dim i As Integer  '循环变量
Dim n As Integer  '取得 列"mynumber "对应的 id
Dim h As Integer  '随机数
Dim g As Integer  '取得 列"id "对应的 mynumber


With rs
'不管三七二十一,首先向表中写入任意常数============
For i = 0 To 7
.AddNew
h = 0 '写入常数0
.Fields("mynumber") = h
.Update
Next i

'然后再编辑这些任意常数0======================
.MoveFirst
For i = 0 To 7
.Edit
line100: h = Int((49 * Rnd) + 1)
.Fields("mynumber") = h

If h = g Then '当编辑数据的时候,发现重复值就提醒
    If MsgBox("在这里产生了一个重复值" + vbCr + "所处的位置id=" & n & "和id=" & n + 1, vbInformation + vbYesNo, "是否重新产生一个数?") = vbYes Then
    GoTo line100
    End If
End If

.Update
n = DLookup("id", "table1", "mynumber=" & h) '取得 列"mynumber "对应的 id
g = DLookup("mynumber", "table1", "id=" & n) '取得 列"id "对应的 mynumber
Debug.Print "随机数=" & g
.MoveNext
Next i
Debug.Print "================="

End With
rs.Close

DoCmd.OpenTable "table1"


[此贴子已经被作者于2006-5-27 0:35:20编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
8#
发表于 2006-5-27 08:39:00 | 只看该作者
发现 7楼的代码有些问题,只能发现 连续两行 中的重复数据 和纠正。重新更改代码如下:

只要 列"mynumber" 中存在重复数据就重新产生一组数据(无论是否处在连续两行)。

==============================

'产生随机数前,删除表 "table1"中的所有记录
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE table1.ID  FROM table1  WHERE (((table1.ID)<>0));  ", -1

line100:
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb()
Set rs = db.openrecordset("select * from table1")

Dim i As Integer  '循环变量
Dim h As Integer  '随机数
Dim z As Integer '取得查询 "qry_un_DISTINCT" 中 列"mynumber"重复项的个数

With rs
For i = 0 To 7
.AddNew
h = Int((49 * Rnd) + 1)
.Fields("mynumber") = h
.Update
Debug.Print "随机数=" & h
Debug.Print "================="
Next i
End With
rs.Close
Set rs = Nothing


z = DCount("mynumber", "qry_un_DISTINCT")
If z >= 2 Then ' 如果包含重复数据
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE table1.ID  FROM table1  WHERE (((table1.ID)<>0));  ", -1 '删除"table1"表中所有数据
GoTo line100 ' 一切代码从头开始
End If

DoCmd.OpenTable "table1"

==========================================


[此贴子已经被作者于2006-5-27 0:40:38编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
9#
发表于 2006-5-27 08:52:00 | 只看该作者
其实简单得仿佛如你前面讲的,建立个表。里面记录1-48的数字,然后用ADO读取表读取的同时将该数字在另外的字段里面标记。凡是标记了的数字就不能使用了。这样做的好处是不用对比,下次使用只需要清除标记就可以了。这种方法看上去好像不专业,不知道是不是!?
10#
发表于 2006-5-27 15:53:00 | 只看该作者
算法描述:建立一个下标为1...N的数组A。

1、随机生成一个1...N之间的数X。

2、取数A(X)。

3、交换A(X)和A(N)

4、N=N-1

5、重复以上步骤。

Private Sub cmdspin_Click()
  Dim A(49) As Integer
  Dim i As Integer
  Dim tmp As Integer
  Dim tmp2 As Integer
  Dim num As String

  For i = 1 To 49
    A(i) = i
  Next i

  Randomize

  For i = 0 To 7
    tmp = Int(((49 - i) * Rnd) + 1)

    tmp2 = A(tmp)
    A(tmp) = A(49 - i)
    A(49 - i) = tmp2

    num = num & tmp2 & ","
  Next i

End Sub

以上代码可用于任意N个数中取M个数。




[此贴子已经被作者于2006-5-27 13:18:32编辑过]

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-10 23:32 , Processed in 0.109540 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表