随机数种子需要什么才能让他在100选80得时候不重复呢??
其二,怎么能快一点??
1 楼laisiwei(.:RNPA:.刺猬)回复于 2002-06-27 08:44:17 得分 10
和前面的一一比较,如果有重复,再重新取一个随机数Top
2 楼griefforyou(为你伤心(http://book.4yt.net 四月天言情小说书库))回复于 2002-06-27 08:52:56 得分 0
upTop
3 楼nik_Amis(...)回复于 2002-06-27 08:59:32 得分 20
Option Explicit
Dim aNum(99) As Integer
Private Sub Form_Load()
Randomize Timer
Gen
Dim n As Integer
For n = 0 To 79
Debug.Print aNum(n)
Next
End Sub
Private Sub Gen()
Dim nIndex As Integer
Dim a, b, s As Integer
For nIndex = 0 To 99
aNum(nIndex) = nIndex + 1
Next
For nIndex = 0 To 50
a = Int(Rnd * 100)
b = Int(Rnd * 100)
s = aNum(a)
aNum(a) = aNum(b)
aNum(b) = s
Next
End Sub
谁有更好的办法?
Top
4 楼LIKEVB(*^-^*,能笑两笑就好了)回复于 2002-06-27 09:00:11 得分 0
to laisiwei(刺猬)
经常死掉了
就是经常重复造成的Top
5 楼robin_xin_xin(鳄鱼宝宝)回复于 2002-06-27 09:17:55 得分 10
有一个“幸运的基督徒”的算法,不知你听过没有?
大意就是N个人排成一圈,数数,数到某个数的人就跳出圈子,下面的人在从一开始数。
为了增加随即性,可以把跳出的人从新再排成一队,重复这个过程
我就是用这个方法制造随即序列的Top
6 楼TechnoFantasy((VB MVP)www.applevb.com)回复于 2002-06-27 09:20:19 得分 10
建一个a(20)的数组,里面的值从80-100,然后取一个0-20之间的随机数,假设是15,那么将a(15)取出来,然后将a(16)到a(20)的数全部前移一位,就是a(16)->a(15), a(17)->a(16)...,然后取0-19之间的随机数,再按照上面的方式取数以及移数。Top
7 楼LIKEVB(*^-^*,能笑两笑就好了)回复于 2002-06-27 09:22:23 得分 0
to robin_xin_xin(鳄鱼宝宝)
我不是个幸运的基督徒 ~~~~
请赐教,有源码???
但是如果基数很大呢??上万个基督徒呢??Top
8 楼TechnoFantasy((VB MVP)www.applevb.com)回复于 2002-06-27 09:26:15 得分 0
我的方法同 robin_xin_xin(鳄鱼宝宝) 差不多Top
9 楼TechnoFantasy((VB MVP)www.applevb.com)回复于 2002-06-27 09:31:27 得分 0
如果很多的话可以再分组,例如10000个可以做一个a(100,100)的数组,另外做一个b(99)的数组记录每一个分组已经取过的次数,初始值为100,每一组取一次以后数组b中相应的值减1。Top
10 楼Naola2001(摆地摊.Net)回复于 2002-06-27 09:35:28 得分 10
为人要取数?你可把100个数进行随机排序,把顺序打乱,然后随机去掉20个不就得了!
呵呵,我的想法总是与众不同。Top
11 楼nik_Amis(...)回复于 2002-06-27 10:09:14 得分 0
LIKEVB(*^-^*,能笑两笑就好了)
我的办法如何??Top
12 楼LIKEVB(*^-^*,能笑两笑就好了)回复于 2002-06-27 10:18:51 得分 0
谢谢 nik_Amis(Azrael)
我用这个方法解决的
For i = txt1 To txt2
100:
a(i) = Int(L_hs * Rnd) + 1
For j = 0 To i - 1
If a(i) = a(j) And i <> j Then
DoEvents
GoTo 100
End If
Next j
Close #1
Open App.Path + "/cj.txt" For Input As #1
Seek 1, a(i) '把指针移到文件1的第1行
Line Input #1, inputdata '读数据
jjj = jjj + 1
Debug.Print inputdata
next i
还很不错Top
13 楼junwhj(http://www.grid2000.com/cn)回复于 2002-06-27 10:28:05 得分 0
Option Explicit
Dim aNum(99) As Integer
Private Sub Form_Load()
Randomize Timer
Gen
Dim n As Integer
For n = 0 To 79
Debug.Print aNum(n)
Next
End Sub
Private Sub Gen()
Dim nIndex As Integer
Dim a, s As Integer
For nIndex = 0 To 99
aNum(nIndex) = nIndex + 1
Next
For nIndex = 0 To 99
a = Int(Rnd * 100)
s = aNum(nIndex)
aNum(nIndex) = aNum(a)
aNum(a) = s
Next
End Sub
Top
14 楼junwhj(http://www.grid2000.com/cn)回复于 2002-06-27 10:30:21 得分 0
TO: LIKEVB(*^-^*,能笑两笑就好了)
你的程序效率太低,试试上面的。Top
15 楼LIKEVB(*^-^*,能笑两笑就好了)回复于 2002-06-27 10:38:43 得分 0
好的,谢谢
以后请多关照Top
16 楼LIKEVB(*^-^*,能笑两笑就好了)回复于 2002-06-27 10:41:56 得分 0
马上试
谢谢关照Top
17 楼nik_Amis(...)回复于 2002-06-27 10:46:08 得分 0
junwhj()
握手,呵呵
Top
18 楼LIKEVB(*^-^*,能笑两笑就好了)回复于 2002-06-27 11:02:44 得分 0
谢谢
结了Top
19 楼starlee(StarLee)回复于 2002-06-27 12:21:02 得分 20
用一个循环跟前面的比较一下,如果有重复,再重新取一个随机数
a:
产生随机数
for 1 to 当前随机数的个数
if 新产生的随机数=当前随机数 then goto a
next
Top
20 楼nik_Amis(...)回复于 2002-06-27 12:29:34 得分 20
For i = txt1 To txt2
100:
a(i) = Int(L_hs * Rnd) + 1
For j = 0 To i - 1
If a(i) = a(j) And i <> j Then
DoEvents
GoTo 100
End If
Next j
Close #1
Open App.Path + "/cj.txt" For Input As #1
Seek 1, a(i) '把指针移到文件1的第1行
Line Input #1, inputdata '读数据
jjj = jjj + 1
Debug.Print inputdata
next i
还很不错
这种办法我一开始也用过
可是效率低了
如果是要求5000个
恐怕就要算很长时间了