随机算法

来源:互联网 发布:移动网络接入点名称 编辑:程序博客网 时间:2024/04/27 06:13

随机数种子需要什么才能让他在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个  
  恐怕就要算很长时间了