主题:[原创]大过年的,大家都对QB兴趣不浓,给一个好的题目,都进来看看■■■■■■■■■■■■■
wjl8719
[专家分:190] 发布于 2009-01-23 00:23:00
求助 怎么搞一个随机排列的数组
各位大哥,偶初学,多帮帮忙
比如把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 楼
天天和和 [专家分:1420] 发布于 2009-06-11 23:01:00
程序的速度要快,简便了 不见得 就快,太繁琐也不好,思考中………………
32 楼
天天学习 [专家分:4570] 发布于 2009-06-16 15:48:00
既然是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 楼
探索者I [专家分:20] 发布于 2009-09-03 22:04:00
话说可以这样的说:
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 楼
探索者I [专家分:20] 发布于 2009-09-03 22:07:00
话说我还没用随机........
35 楼
phile [专家分:2310] 发布于 2009-09-05 12:21:00
额
36 楼
天天和和 [专家分:1420] 发布于 2009-09-17 22:16:00
晕倒
37 楼
phile [专家分:2310] 发布于 2009-09-18 18:17:00
为何
38 楼
t565022817 [专家分:20] 发布于 2009-09-19 19:27:00
定义两个数组,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 楼
t565022817 [专家分:20] 发布于 2009-09-20 11:15:00
我的代码:整理一下:
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 楼
phile [专家分:2310] 发布于 2009-09-21 18:52:00
老天,你不会用FOR
我来回复