一个简单的算法问题,怎么样在一个数组里获得4个不同的数字

HoneyPooh 2006-03-12 06:18:49
4个数的范围是0到9
...全文
383 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
fishmans 2006-03-13
  • 打赏
  • 举报
回复
dim str as string
dim Result(3) as integer
dim Pos as integer
str="0123456789"
for i=0 to 3
randomize
pos = Int(Rnd * (len(str)) + 1
result(i)=mid(str,pos,1)
str=replace(str,result(i),"")
next
注:只满足楼主要求
of123 2006-03-13
  • 打赏
  • 举报
回复
算法思路:

一般的想法是 4 个变量顺序求随机数,遇到重复则抛弃重试。
但对于一个快速算法,我的意见是先建立符合要求的解集,然后在取值时随机抽取。

例如你的问题,可以先求出 10 中取 4 的全部组合,保存到一个大小为 210 的数组中。
取值时,求小于等于 210 的随机数,就可以得到一组值。如果你的解要求是排列,可以在对 4 个元素乱序处理。
RUKYO 2006-03-13
  • 打赏
  • 举报
回复
哈~此贴好!
KiteGirl 2006-03-13
  • 打赏
  • 举报
回复
Private Sub Command1_Click()

'必要参数
Dim A() As Long '数组
Dim Aoc As Long '输出数组{1 <= Aoc <= (Vlen+1)}
Dim Vmax As Long '数值绝对上界{ Vmax > Vmin }
Dim Vmin As Long '数值绝对下界{ Vmin < Vmax }

'可导参数
Dim Vlen As Long '数值相对范围
Dim I As Long '索引
Dim Iom As Long '输出索引最大
Dim Isw As Long '交换指针
Dim Vst As Long '临时储值变量

Vmin = 0: Vmax = 9: Aoc = 4

Vlen = Vmax - Vmin
Iom = Aoc - 1

ReDim A(0 To Vlen)

'数组初始化
For I = 0 To Vlen
A(I) = I + Vmin
Next

Randomize Timer

'数组乱序(这里是“跳蚤算法”的快速型变种算法)
For I = 0 To Iom
Isw = Int(Rnd * 10)
Vst = A(Isw): A(Isw) = A(I): A(I) = Vst 'Swap A(Isw),A(I)
Next

ReDim Preserve A(0 To Iom)

Text1.Text = ""

For I = 0 To Iom
Text1.Text = Text1.Text & " " & A(I)
Next
End Sub
KiteGirl 2006-03-13
  • 打赏
  • 举报
回复
用“跳蚤算法”,一会给你个例子……
northwolves 2006-03-13
  • 打赏
  • 举报
回复
虽然许多人不愿意使用,一般可以用集合处理此类问题:

Sub xx()
Dim x As New Collection, i As Integer, j As Byte, result As String
result = ""
For i = 0 To 9
x.Add i
Next
For i = 1 To 4
Randomize
j = Int(Rnd * (x.Count)) + 1
result = result & x(j)
x.Remove j
Next
Debug.Print result
End Sub
NewViewStudio 2006-03-13
  • 打赏
  • 举报
回复
Dim A(0 to 9) as byte ,I as long
for i=0 to 9
A(i)=i
next
for i=0 to 1000
randomize timer
swap A(int(rnd*10)),a(int(rnd*10))
next

********************

private sub SWAP(A as byte,B as byte)

Dim T as byte
t=a:a=b:b=t

end sub

*******************

然后你按照顺序调用A(...)即可

不过程序中用RANDOMIZE TIMER稍微有点达不到理想状态,应该把TIMER改为API函数GETTICKCOUNT更好。
lsftest 2006-03-12
  • 打赏
  • 举报
回复
lzw858(落伍者)兄的方法理论上有可能运行一年都出不了结果。。。。。。
northwolves 2006-03-12
  • 打赏
  • 举报
回复
Private Sub Command1_Click()
Dim x(9) As Byte, i As Integer, j As Byte, result As String
For i = 0 To 9
x(i) = i
Next
For i = 1 To 4
Randomize
j = Int(Rnd * (10 - i))
result = result & x(j)
x(10 - i) = x(j)
x(j) = 10 - i
Next
MsgBox result
End Sub
lzw858 2006-03-12
  • 打赏
  • 举报
回复
现在可以用这个初始化随机种子,以前我还不懂这个
Do '随机产生数字
Randomize
a = 9 * Rnd\1
b = 9 * Rnd\1
c = 9 * Rnd\1
d = 9 * Rnd\1
Loop While a = b Or a = c Or a = d Or b = c Or b = d Or c = d
lzw858 2006-03-12
  • 打赏
  • 举报
回复
Do '随机产生数字
a = Right(Time * Rnd, 1)
b = Right(Time * Rnd, 1)
c = Right(Time * Rnd, 1)
d = Right(Time * Rnd, 1)
Loop While a = b Or a = c Or a = d Or b = c Or b = d Or c = d

以前我做猜数字时随机产生四个不同的数字用的

给分吧
HoneyPooh 2006-03-12
  • 打赏
  • 举报
回复
那个谁不知道啊。。。

偶要实际的

偶在一些思路上卡住了。。
jobs002 2006-03-12
  • 打赏
  • 举报
回复
循环,比较,接分.......

741

社区成员

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

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