求教算法,从m个数取n个数并放到数组中???

netmuse 2002-03-04 09:40:11
m>n,这n个数不重复。
...全文
131 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxlroad 2002-03-06
  • 打赏
  • 举报
回复
排列 组合
Seedling 2002-03-06
  • 打赏
  • 举报
回复
对m个数先排序并将相同的数保留一个而获得新数组m1,然后进行排列、组合
即可。
xxlroad 2002-03-05
  • 打赏
  • 举报
回复
这样不可以吗?
xxlroad 2002-03-05
  • 打赏
  • 举报
回复
For i = 1 To temp '产生随机数
c(i) = Int(Rnd * temp) + 1
k = i
For j = 1 To k - 1 '如果相同则这个数不要 重新选取
If c(j) = c(k) Then i = i - 1
Next j
Next i
netmuse 2002-03-05
  • 打赏
  • 举报
回复
我想做的是把所有的组合全部放到数组中去!
Bardo 2002-03-04
  • 打赏
  • 举报
回复
10行程序能搞定!
bluewindw 2002-03-04
  • 打赏
  • 举报
回复
我真不知道做程序的,一个简单的问题,总想的这么复杂?:)
KiteGirl 2002-03-04
  • 打赏
  • 举报
回复
示例:从0-9这十个数字里取5个出来。

Dim MM() As Integer
Dim MN()

N=5
M=10

ReDim MM(9)

For tLoop=0 To M-1 '把M个皮球顺序放到洗衣盆里。
MM(tLoop)=tLoop
Next

For tLoop=0 To M-1 '小仙妹跳进洗衣盆里一顿扑腾,把皮球搅和的乱七八糟。
DataSwap MM(tLoop),MM(Int(Rnd*M))
Next

ReDim MN(N-1)

For tLoop=0 To N-1 '小仙妹从洗衣盆里撇出N个球扔到另一个洗衣盆里。
MN(tLoop)=MM(tLoop)
Next

Function DataSwap(pA,pB)
tT=pA:pA=pB:pB=tT
End Function
KiteGirl 2002-03-04
  • 打赏
  • 举报
回复
想在M个数里随机取N个数其实很简单。可以这样来理解:有M个球,你把这些球放在洗澡盆里搅和半个小时。然后随便拣出来N个。

具体算法就是:

1、在数组M里储存N个数。
2、打乱数组序列。
3、从数组第一个元素取到第N个,并顺序放到另一个数组中。

打乱数组序列的办法是这样的:

将数组里的每个元素与随机指定的一个元素交换。

MCound=Abs(Ubound(M)-LBound(M))+1取数组元素数量。

For tLoop=LBound(M) To UBound(M)
DataSwap M(tLoop),M(Int(rnd*MCound)+LBound(M))
Next

DataSwap函数的作用是交换两变量的值。
wxj_lake 2002-03-04
  • 打赏
  • 举报
回复
呵呵,我想TechnoFantasy所说的m数组其实是一个链表比较合适。也许他所指的删除就是Redim Perserve,那就没有问题啦。
TechnoFantasy 2002-03-04
  • 打赏
  • 举报
回复
当然是不能到0的了,
首先,m数组的下标为1,到最后两个数的随机数取值就是1或者2
其次,如果到m数组只剩一个数时,当然程序需要判断,就不执行随即取数了,就剩一个了,还随机什么?
xxlroad 2002-03-04
  • 打赏
  • 举报
回复
'请把下面的保存为 Form1.frm

VERSION 5.00
Begin VB.Form Form1
Caption = "生成随机数"
ClientHeight = 4185
ClientLeft = 60
ClientTop = 345
ClientWidth = 8595
LinkTopic = "Form1"
LockControls = -1 'True
MaxButton = 0 'False
ScaleHeight = 4185
ScaleWidth = 8595
StartUpPosition = 3 'Windows Default
Begin VB.TextBox Text2
BeginProperty Font
Name = "宋体"
Size = 14.25
Charset = 134
Weight = 400
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 360
Left = 5295
TabIndex = 0
Text = "20"
Top = 330
Width = 660
End
Begin VB.CommandButton Command3
Caption = "打印(&P)"
Height = 495
Left = 3435
TabIndex = 3
Top = 3480
Width = 1770
End
Begin VB.TextBox Text1
BeginProperty Font
Name = "宋体"
Size = 14.25
Charset = 134
Weight = 400
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 2265
Left = 195
MultiLine = -1 'True
ScrollBars = 3 'Both
TabIndex = 1
Top = 900
Width = 8205
End
Begin VB.CommandButton Command1
Caption = "生成随机数(&B)"
Default = -1 'True
Height = 495
Left = 825
TabIndex = 2
Top = 3480
Width = 1770
End
Begin VB.CommandButton Command2
Cancel = -1 'True
Caption = "退出(&E)"
Height = 495
Left = 6060
TabIndex = 4
Top = 3480
Width = 1770
End
Begin VB.Label Label1
AutoSize = -1 'True
BackStyle = 0 'Transparent
Caption = "请输入要生成的随机数范围:1~ (1,200)"
BeginProperty Font
Name = "宋体"
Size = 14.25
Charset = 134
Weight = 400
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 285
Left = 1095
TabIndex = 5
Top = 360
Width = 6345
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub Form_Load()
With Text2
.Text = 20
.SelStart = 0
.SelLength = Len(.Text)
End With
End Sub

Private Sub Command1_Click()
Dim a(200) As Byte
Dim c(200) As Byte
Dim temp As Byte
temp = Val(Text2.Text)
Randomize Timer
For i = 1 To temp '产生随机数
c(i) = Int(Rnd * temp) + 1
k = i
For j = 1 To k - 1 '如果相同则这个数不要 重新选取
If c(j) = c(k) Then i = i - 1
Next j
Next i
For i = 1 To temp
Text1.Text = Text1.Text & c(i) & ","
'If i Mod 10 = 0 Then
' Text1.Text = Text1.Text & Chr(13) + Chr(10)
'End If
Next i
Text1.Text = Text1.Text & Chr(13) + Chr(10)
With Text1
.SelStart = 0
.SelLength = Len(.Text)
End With
End Sub

Private Sub Command3_Click()
On Error GoTo 100
Printer.Print Text1.Text
100
End Sub

Private Sub Command2_Click()
End
End Sub

Private Sub Text2_Change()
If Val(Text2.Text) < 1 Or Val(Text2.Text) > 200 Then
With Text2
.Text = 20
.SelStart = 0
.SelLength = Len(.Text)
End With
End If
End Sub

Private Sub Text2_GotFocus()
With Text2
.SelStart = 0
.SelLength = Len(.Text)
End With
End Sub


'20,12,10,3,14,9,7,17,11,5,8,6,16,15,19,13,4,2,18,1,
'20,15,11,8,16,4,18,12,14,6,3,19,7,10,13,5,1,9,17,2,
baoxiang 2002-03-04
  • 打赏
  • 举报
回复
TechnoFantasy(www.applevb.com) 的方法有接近0的可能会死循环。
那就是所有的随机数都是同一个数字。
以前fraser01的算法是:
在30个数子中取10个。
第一个是a(rnd*30),然后将a(rnd*30)与a(30)互换。(a()是已经赋过值的数组)
第二个是a(rnd*29),然后将a(rnd*29)与a(29)。
依次类推,直到取满所有的数为止。
chsl918 2002-03-04
  • 打赏
  • 举报
回复
For K = 1 To 3
bUser = False
Do While Not bUser
bUser = True
dUserSERV(0) = dSERV(Int(iSERV * Rnd + 1))
For L = 1 To 3
If dUserSERV(0) = dUserSERV(L) Then bUser = False
Next L
bUser = Not bUser
Loop
dUserSERV(K) = dUserSERV(0)
Next K
以上程序是从dSERV(iSERV) (其中iSERV)为你的总数及你的m,随机提取三个数我想这个三就是你的n了。而且这三个数保证都是不重复的了!给你试一试吧!是我春节后才作的。
TechnoFantasy 2002-03-04
  • 打赏
  • 举报
回复
架设你有10个数的数组m,首先取一个1到10间的随机数取整,然后从m数组中取得这个下标的数放到新数组n中,然后将它从m数组中删除,然后取一个从1到9的随机数取整,从m中取得这个下标的数,然后将它从m数组中删除,依次类推,直到m数组为空或者取完。
forever_chang 2002-03-04
  • 打赏
  • 举报
回复
把这m个数放到数据库的一个表中,
然后直接"SELECT DISTINCT ..."
:)
cuiyxy 2002-03-04
  • 打赏
  • 举报
回复
不知道你想做什么?
baoxiang 2002-03-04
  • 打赏
  • 举报
回复
这个问题,我记得以前FRASER01的贴子里有的。你可以检索找找看
Fanks 2002-03-04
  • 打赏
  • 举报
回复
随机抽取吗?

742

社区成员

发帖
与我相关
我的任务
社区描述
VB 版八卦、闲侃,联络感情地盘,禁广告帖、作业帖
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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