VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 5062|回复: 10

二哥你好,我是新人,能否帮我解决一下问题?

[复制链接]
 楼主| 发表于 2007-8-16 20:39:11 | 显示全部楼层 |阅读模式
从M个数中取N个数(M>N)一次取成不许重复用动态数组

既:
从1,2,3,4,5,7,8,9,10这个十个数中随机取五个吧这五个要求一次取出五个数不同重复

比如说取出3,5,7,8,10

是一次取出的
一般来说会出现这样的情况

3,3,5,7,7,8,10

错了

会出现这样的情况3,3,5,7,7

现在是一次取出的数要求不能重复

即不能取出两个一样的数

而后再去比较再去重新随机生成数再去比较

是一次取出

不一样的数
发表于 2007-8-16 21:15:47 | 显示全部楼层
哇,你这样点名提问,二哥的那个压力是相当的大啊~
为了避免二哥压力过大,我先来胡乱说一下,你只要像洗扑克牌一样,然后拿出指定的5张(如前5张或1、3、5、7、9张)就好啦~ 呵呵~
回复 支持 反对

使用道具 举报

发表于 2007-8-16 21:20:05 | 显示全部楼层

这是我某个程序的部分源码,你可以参考一下,呵呵

  RandomDegree = mJigsawPuzzleColumeCount * mJigsawPuzzleRowCount '洗牌次数
  Randomize Timer
  For i = 1 To RandomDegree
    r1 = Int(Rnd * mJigsawPuzzleColumeCount * mJigsawPuzzleRowCount)
    r2 = Int(Rnd * mJigsawPuzzleColumeCount * mJigsawPuzzleRowCount)

'交换
    temp = gBlockOrder(r1)
    gBlockOrder(r1) = gBlockOrder(r2)
    gBlockOrder(r2) = temp
  Next i
回复 支持 反对

使用道具 举报

发表于 2007-8-16 21:22:39 | 显示全部楼层

我就回一个字

原帖由 ty20me 于 2007-8-16 21:18 发表
我不是二哥,可是还是给你提提意见吧

每次取一个后,删掉取出的那个,剩余的重新选,最后得五个
代码略

回复 支持 反对

使用道具 举报

发表于 2007-8-17 21:25:32 | 显示全部楼层
极简单的么……

弄个数组,放好你要的数(有多少就定义多少,然后按顺序赋值).
然后循环足够多次, 每次都将随机选出的两数对调.得出一个乱序.
然后从前面取出需要的 N 个数就行了.
这种算法比较麻烦,但是好理解.

嘿嘿,这帖子早看到了,奈何不是问俺......
回复 支持 反对

使用道具 举报

发表于 2007-8-17 21:28:36 | 显示全部楼层
原帖由 ty20me 于 2007-8-16 21:18 发表
每次取一个后,删掉取出的那个,剩余的重新选,最后得五个
代码略

三楼的想法确实简单,但实现起来难度不小.
大多数的新手还不熟悉集合的用法,要用数组实现这个想法可是挺费劲的.
回复 支持 反对

使用道具 举报

发表于 2007-8-17 21:33:15 | 显示全部楼层
要我说,比较理想的算法应该是:

1. 通过 Ubound() 函数获得数组上限
2. 在数组上限之内,取出数组中随机下标的一个数;
3. 将该数与最后一个(数组上限)数对调;
4. 将数组上限减一;(使用 ReDim 函数)
5. 判断是否取了足够多的数,若不够返回第一步.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-18 16:19:53 | 显示全部楼层
谢谢诸位了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-27 19:17:01 | 显示全部楼层

二种方法实现随机数一次取成

'*************************************************************************
'**模 块 名:工程1 - Form1
'**说    明:魔灵圣域 版权所有2007 - 2008(C)
'**创 建 人:郭卫
'**日    期:2007-12-27 19:20:11
'**修 改 人:
'**日    期:
'**描    述:
'**版    本:V1.0.0        http://icecept.blog.sohu.com
'*************************************************************************
Option Base 1
Private Sub Command1_Click()
    Randomize Timer
    Dim A(1 To 10) As Integer   '数组M
    Dim B(1 To 8) As String     '数组N
    Dim i As Integer, k As Integer, t As Integer
    For i = 1 To 10
       A(i) = i
    Next
    For i = 1 To 10               '数组打乱
       t = A(i)
       k = Fix(Rnd * 10) + 1
       A(i) = A(k)
       A(k) = t
    Next
    For i = 1 To 8 '从M中随机取出N个数,不重复
        B(i) = A(i)
    Next
    Label1.Caption = Join(B(), " , ")
End Sub
Private Sub Command2_Click()
    Randomize Timer
    Dim Dimension(8)
    Dim i As Byte, j As Byte
    Randomize Timer
    For i = 1 To 8
         Dimension(i) = Fix(Rnd * 10) + 1
    Next i
A:    For i = 1 To 7
        For j = i + 1 To 8
          If Dimension(i) = Dimension(j) Then
             Dimension(i) = Fix(Rnd * 10) + 1
             GoTo A
          End If
        Next j
     Next i
     Label1.Caption = Join(Dimension(), " , ")
End Sub
Private Sub Command3_Click()
    End
End Sub

随机数一次取成问题结贴

[ 本帖最后由 icecept 于 2007-12-27 19:18 编辑 ]

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-29 00:09:38 | 显示全部楼层
真怀念我第一次在论坛发贴的时候,那时我还是一个菜鸟,还好那时论坛的高手颇多。二年使我成为了高手。可惜现在已有好多人不在论坛了。vb6的时代已经过去。

点评

嗯,现在论坛只剩发广告的和删广告的  发表于 2015-8-30 11:01
回复 支持 反对

使用道具 举报

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

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-7-1 21:48

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表