回 帖 发 新 帖 刷新版面

主题:[原创]大过年的,大家都对QB兴趣不浓,给一个好的题目,都进来看看■■■■■■■■■■■■■

求助 怎么搞一个随机排列的数组  
各位大哥,偶初学,多帮帮忙 
比如把1、2、3、……100随机乱排成 45、7、8、……再依次放进数组A(100)里面 
我现在就只会用循环比如(只是思路,语法不一定对) 
…… 
40 FOR I=1 TO 100 
50 A(I)=INT(RND(1)*100) 
60 FOR X=1 TO I-1 
70 IF A(I)=A(X) THEN GOTO 50 
80 NEXT 
90 NEXT 
…… 
要是数字很多的话就要循环很久了 
有没有更好的方法呢  
------------------------------------------------------------------------------
分割线以上是我复制过来的,不用上面那种方法,大家思考一 下,看以大家的智慧能得几种方法

我是思考半天才想出一种来,等过完年我把我的再发出来.

多多亦善 
 

[em3][em3][em3][em3]

回复列表 (共40个回复)

31 楼

程序的速度要快,简便了 不见得 就快,太繁琐也不好,思考中………………

32 楼

既然是1~100都放到数组里去,那还不如直接生成1~100的不重复数字,放到数组里得了,不用交换
[code=c]dim a(100)    '在VB里应该是dim a(99)就有100个元素了,我不知道QB里有何不同,延用前面几位的吧
dim bit(100)  '表示index的数字是否已经存在,初始化为0
for i = 1 to 100
   do
      t=rnd() *99 + 1
   loop while bit(t) <> 0
   bit(t)=1
   a(i)=t
next
[/code]主要费时的在于do...while。在最差的情况下,有可能永远也执行不完 。(随机数t总是为已经存在的数,不过,如果这种情况发生,只说明你RP太霉了..[em1]),最好的情况下,一次到位,100次,这也需要RP很好。效率看似不稳定,但从统计学来看应该是稳定的
PS.可以在do...while里加一句triedTime=triedTime + 1,看看到底试了多少次才生成了100个不重复的数.
PS.在rnd取值之前加Randomize,triedTime一般在200~300之间,但有时会需要上万次的triedTime,从页影响了平均triedTime;而不加Randomize,则较稳定,一般在500~700之间,平均下来,500多.
这里附一份VB6.0里的代码,可以试运行一下
[code=c]
Private Sub Command1_Click()
Dim bit(99) As Integer
Dim a(99) As Integer
Dim t As Integer
Dim triedTime As Long
Dim i As Integer
Static nClick As Long
Static totalTriedTime As Long
Dim avgTriedTime As Single
For i = 0 To 99
    Do
        'Randomize
        t = Rnd() * 99 + 1
        triedTime = triedTime + 1
    Loop While bit(t - 1) <> 0
    bit(t - 1) = 1
    a(i) = t
    'Debug.Print t
Next
nClick = nClick + 1
totalTriedTime = totalTriedTime + triedTime
avgTriedTime = totalTriedTime / nClick
Debug.Print triedTime, totalTriedTime, avgTriedTime
End Sub
[/code]

33 楼

话说可以这样的说:
dim a(100)
For i=1 to 100
a(i)=i
for j=1 to i-1
swap a(j),a(j-1)
next j
next i
for k=1 to 100
print a(k)
next k
可以的......还很乱.......LZ......你的题目很悲剧哎.........




34 楼

话说我还没用随机........

35 楼

36 楼

晕倒

37 楼

为何

38 楼

定义两个数组,A(100)和B(100)
把A(100)赋值为1~100
i=1
随机从1~100取r,若A(r)不等于0,则将A(r)赋值给B(i),并将0赋值给A(r),
i=i+1
循环……

39 楼

我的代码:整理一下:
CLS
DIM A(100)
DIM B(100)
FOR i=1 TO 100
  A(i)=i
NEXT i
FOR j=1
  RANDOMIZE TIMER
  r = INT(RND * (100) + 1)
  IF A(r)<>0 THEN
    B(j)=A(r)
    A(r)=0
  ELSE
    j=j-1
NEXT j
PRINT B(1);B(2);B(3);B(4);B(5);B(6);B(7);B(8);B(9);B(10);
PRINT B(11);B(12);B(13);B(14);B(15);B(16);B(17);B(18);B(19);B(20);
PRINT B(21);B(22);B(23);B(24);B(25);B(26);B(27);B(28);B(29);B(30);
PRINT B(31);B(32);B(33);B(34);B(35);B(36);B(37);B(38);B(39);B(40);
PRINT B(41);B(42);B(43);B(44);B(45);B(46);B(47);B(48);B(49);B(50);
PRINT B(51);B(52);B(53);B(54);B(55);B(56);B(57);B(58);B(59);B(60);
PRINT B(61);B(62);B(63);B(64);B(65);B(66);B(67);B(68);B(69);B(70);
PRINT B(71);B(72);B(73);B(74);B(75);B(76);B(77);B(78);B(79);B(80);
PRINT B(81);B(82);B(83);B(84);B(85);B(86);B(87);B(88);B(89);B(90);
PRINT B(91);B(92);B(93);B(94);B(95);B(96);B(97);B(98);B(99);B(100);
END

40 楼

老天,你不会用FOR

我来回复

您尚未登录,请登录后再回复。点此登录或注册