设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

如何随机不重复读取一个数组??

[复制链接]
跳转到指定楼层
1#
发表于 2002-12-29 19:20:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
假设有一数组
dim x(1 to 100) as long
如何,随机的读取x(i)   i>1 and i<100,且不要重复~
谢谢大家~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2002-12-29 20:53:00 | 只看该作者
读数前先洗一下“牌”。
dim j as integer, k as integer,temp as long
for j = 1 to 500 '洗牌次数
   k=int(Rnd*100)+1
   temp=x(1)
   x(1)=x(k)
   x(k)=Temp
Next

然后再取X(1)~X(i)就行了
3#
 楼主| 发表于 2002-12-30 07:48:00 | 只看该作者
斑竹,你好,谢谢你!
看了你的程序,还没有调试,有一点疑问?

1。随机数产生的k可能是相同的,那么同一x(k),就可以能赋给不同的x(i)?
2。循环500,是为了增大几率吗?x(1)到x(100)的是否都可以循环的到?

谢谢,帮忙回答一下拉~~~

点击这里给我发消息

4#
发表于 2002-12-30 16:27:00 | 只看该作者
关注结果。
5#
发表于 2002-12-30 16:57:00 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

点击这里给我发消息

6#
发表于 2002-12-30 17:21:00 | 只看该作者
以下是引用jiek在2002-12-29 23:47:54的发言:
斑竹,你好,谢谢你!
看了你的程序,还没有调试,有一点疑问?

1。随机数产生的k可能是相同的,那么同一x(k),就可以能赋给不同的x(i)?
2。循环500,是为了增大几率吗?x(1)到x(100)的是否都可以循环的到?

谢谢,帮忙回答一下拉~~~


可以回答这些问题吗?谢谢!
7#
发表于 2002-12-30 18:28:00 | 只看该作者

我个人认为单靠这几个变量,无法保证随机值不重复

如果要不重复地取值,要靠表来协助。所有的待选结果都放在一个表中,每个值都有一个是否已被选的标志字段,每次选取值的时候都查看该值是否被选中,如果是,就跳到下一记录。
    我刚学Access时做过一个随机选题的例子,可以参考一下。
    http://www.accxp.com/club/topic.cgi?forum=7&topic=202&show=400
8#
发表于 2002-12-30 18:48:00 | 只看该作者
这个算法的原理是把数组X()里面的元素顺序调乱,没有取数也没有赋值,如果取两个随机数,以两个随机数为下标的数组元素互换效率会更高。就像一叠牌,每次从中间抽一张放到排顶,排顶的牌插入中间(或两牌互换位置),只要抽排的次数够多(循环500以上),牌就会均匀分布(洗牌过程),当然不保证是否都可以循环的到(有必要吗?)
执行完这个算法(洗牌过程)后,才是取数过程,按顺序取需要的个数或全部,像发牌一样。
这样的算法在要随机取给定数组的全部或大部分元素时比较适用。
当你不想打乱原数组的顺序时,可复制一个数组或给出一个维数相同的数列(象指针)进行处理。
9#
发表于 2002-12-30 18:54:00 | 只看该作者
我也很想知道如何不用100个变量来做选取标志,而选取出100个不重复的数组值。


[此贴子已经被作者于2002-12-30 10:53:38编辑过]

10#
发表于 2002-12-30 19:26:00 | 只看该作者

不重复读取一个数组,搞定!!

Private Sub 命令0_Click()
Dim a(1 To 100) As Long
Dim b(1 To 100) As Boolean
Dim i, j, k As Integer
'赋值给数组
    i = 1
    Do While i <= 100
        a(i) = i
        i = i + 1
    Loop

'从数组随机读取值
    For j = 1 To 100
        k = Int(Rnd * 100) + 1
        Do While b(k) = True
            k = k + 1
            If k > 100 Then k = 1
        Loop
        b(k) = True
        Debug.Print a(k)
        x = x + 1
        DoEvents
    Next j
End Sub
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-14 14:40 , Processed in 0.116133 second(s), 33 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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