设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

[模块/函数] 生成100个不重复的随机数

[复制链接]
跳转到指定楼层
1#
发表于 2008-8-2 23:45:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Private Sub Command5_Click()
Dim rn() As String
rn = Split(fncRndNum(1, 100, 100), ",")
Text1 = Join(rn)
End Sub

Private Function fncRndNum(llMinNum As Long, llMaxNum As Long, Num As Long) As String
    Dim lsTemp As String
    Dim lsNum As String
    Do While Num > 0
        lsNum = Int(Rnd * (llMaxNum - llMinNum + 1)) + llMinNum
        If InStr(lsTemp, lsNum) = 0 Then
            lsTemp = IIf(lsTemp = "", "", lsTemp & ",") & lsNum
            Num = Num - 1
        End If
    Loop
    fncRndNum = lsTemp
End Function

剩下9个数的时候一直死循环,但是改为101到200或其它高于101以上的数却没有问题,怪怪的,偶看不出什么问题,各位大侠分析析看看。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
发表于 2008-8-3 08:37:21 | 只看该作者
如C版所说,楼主的方法有点慢。至于去掉重复,我也改一下:
  1. '生成100个不重复的随机数
  2. Private Sub Command5_Click()
  3. Dim rn() As String
  4. rn = Split(fncRndNum(1, 100, 100))
  5. Text1 = Join(rn)
  6. End Sub

  7. Private Function fncRndNum(llMinNum As Long, llMaxNum As Long, Num As Long) As String
  8.     Dim lsTemp As String
  9.     Dim lsNum As String
  10.     lsTemp = " "
  11.     Do While Num > 0
  12.         lsNum = Int(Rnd * (llMaxNum - llMinNum + 1)) + llMinNum & " "
  13.         If InStr(lsTemp, " " & lsNum) = 0 Then
  14.             lsTemp = lsTemp & lsNum
  15.             Num = Num - 1
  16.         End If
  17.     Loop
  18.     fncRndNum = Trim(lsTemp)
  19. End Function
复制代码

[ 本帖最后由 t小宝 于 2008-8-3 08:41 编辑 ]
3#
发表于 2008-8-3 10:20:46 | 只看该作者
在1-100随机,也就是1-100的数都会全用到,对吗
4#
 楼主| 发表于 2008-8-3 17:32:23 | 只看该作者
谢谢各位,这是绝简单速度的不重复随机数。先把1到100顺序存入a[]数组中,随机生成一个1到100之间的整数b,交换a[1]与a;再随机生成一个2到100之间的整数b,交换a[2]与a...最后随机生成一个1到100之间的整数b,交换a[30]与a,a[]数组前100个数即所求。
用VB编程如下:
Private Sub Form_Load()
Dim i, j, a(100) As Integer
For i = 1 To 100
a(i) = Str(i)
Next
Text1 = ""
For i = 1 To 100
j = (100 - i) * Rnd + i
a(0) = a(j)
a(j) = a(i)
a(i) = a(0)
Text1 = Text1 & Chr(32) & a(i)
Next
End Sub


但我问的并不是这个,而是不明白为什么1到100时会假死,而101到200以上却不会
5#
发表于 2008-8-3 18:49:35 | 只看该作者
Do While Num > 0
100-100=0
200-100=100
问题应该出在这里.
6#
发表于 2008-8-3 18:52:03 | 只看该作者
lsNum = Int(Rnd * (llMaxNum - llMinNum + 1)) + llMinNum
应该是大于1且<100吧?
这里面有100个整数值吗?
7#
发表于 2008-8-3 23:42:07 | 只看该作者
原帖由 ui 于 2008-8-3 10:20 发表
在1-100随机,也就是1-100的数都会全用到,对吗


同意!!问题本身就是无意义
8#
 楼主| 发表于 2008-8-4 17:01:58 | 只看该作者
原帖由 tz-chf 于 2008-8-3 23:42 发表


同意!!问题本身就是无意义

怎么会没有意义呢,例如100道题,打乱来随机出题,不重复直到全部出完为止,你能说这没意义?
9#
发表于 2008-8-4 17:29:04 | 只看该作者
原帖由 盗到稻 于 2008-8-4 17:01 发表

怎么会没有意义呢,例如100道题,打乱来随机出题,不重复直到全部出完为止,你能说这没意义?


如何是这种情况,你的算法就太差了。100道题打乱顺序也没多大意思。

[ 本帖最后由 tz-chf 于 2008-8-4 17:30 编辑 ]
10#
发表于 2008-8-4 18:09:55 | 只看该作者
原帖由 盗到稻 于 2008-8-4 17:01 发表

怎么会没有意义呢,例如100道题,打乱来随机出题,不重复直到全部出完为止,你能说这没意义?


若是用于出题,一次仅显示一题,那么应该是去除法。把已经抽到的题排除在外,在没有抽到的题中再次选择。
若仅有100题,打乱后全部显示出来,这个跟按顺序全部显示是一样的,是没有意义的。
再说,随机出题,题库不可能全部用完。
[:31] [:31]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-8 13:35 , Processed in 0.097098 second(s), 33 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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