主题:要在1-10之间找4个不重复的随机数。请教!
			 yucom4011
				 [专家分:50]  发布于 2003-01-23 09:39:00
 yucom4011
				 [专家分:50]  发布于 2003-01-23 09:39:00							
			    在1到10之间找4个不重复的随机数。我的思路是随机产生4个数,然后判断它们之间是否存在重复。即产生4个数后判断:
   if t(1)<>t(2) and t(1)<>t(3) and t(1)<>t(4) and t(2)<>t(3) and t(2)<>t(4) and t(3)<>t(4) then ....
   这样很麻烦,而且有时间很费时间的。请问有什么更好的代码吗?
						
					 
		
			
回复列表 (共22个回复)
		
								
				沙发
				
					 Senna [专家分:10]  发布于 2003-01-23 14:42:00
Senna [专家分:10]  发布于 2003-01-23 14:42:00				
				可以用循环来做
Randomize
Rnd
For i = 1 To 4
    Do
        k = Int(10 * Rnd + 1)
        blnE = False
        For j = 1 To 4
            If t(j) = k Then
                blnE = True
                Exit For
            End If
        Next j
        If Not blnE Then
            t(i) = k
            Exit Do
        End If
    Loop
Next
不过这样的代码更加长
							 
						
				板凳
				
					 eerfaone [专家分:490]  发布于 2003-01-23 23:49:00
eerfaone [专家分:490]  发布于 2003-01-23 23:49:00				
				senna兄的回答很精彩呀!
							 
						
				3 楼
				
					 wtf1019 [专家分:0]  发布于 2003-01-24 21:52:00
wtf1019 [专家分:0]  发布于 2003-01-24 21:52:00				
				mid a(3) as long, b as integer
a(b)=(rnd*10+1)
do 
c=(rnd*10+1)
for i=0 to 3
if b=3 then exit do
if c<>a(i) then b=b+1:a(b)=c:exit for
next
loop
也不知道对吗~!但也想帮你一个忙了!~
							 
						
				4 楼
				
					 Hanan [专家分:700]  发布于 2003-01-29 14:11:00
Hanan [专家分:700]  发布于 2003-01-29 14:11:00				
				每次判断的话,速度很慢,以前我编个程序,要选近万不重复的随机号,后来发觉太慢。
换个思路是这样的,用一个数租,里面放顺序的数,用随机变量ran = 100 Mod num指定下标,一开始num是10,每次选中的arr[ran]拿出来用,再arr[ran] = arr[num],然后num = num - 1,接着一直循环下去。
这样一来速度很快。
							 
						
				5 楼
				
					 qjs_2002 [专家分:0]  发布于 2003-02-12 13:52:00
qjs_2002 [专家分:0]  发布于 2003-02-12 13:52:00				
				转换成二进制,进行异或运算
							 
						
				6 楼
				
					 yfpw [专家分:0]  发布于 2003-02-23 12:52:00
yfpw [专家分:0]  发布于 2003-02-23 12:52:00				
				int a[3] = {0};
srand(time(NULL));
while(!a[3])
{
							 
						
				7 楼
				
					 yfpw [专家分:0]  发布于 2003-02-23 14:12:00
yfpw [专家分:0]  发布于 2003-02-23 14:12:00				
				Hanan兄,咱真是那个什么雄什么同的,以前做项目时,我就经常用这种方法,
因许久未用VB,早就忘了,故用C代码代替.
#define NUM 10;
#define REQ 3;
int a[NUM-1], b[REQ];
int i, rand, number = NUM;
srand(time(NULL));
for(i = 0; i < NUM; i++)
     a[i] = i;
for(i = 0; i <= REQ; i++)
{
  rand = rand() % (number - i);
  b[i] = a[rand];
  a[rand] = a[number-i];
}
象这样程序的扩充性就很好,但是有点浪费内存. 
							 
						
				8 楼
				
					 yfpw [专家分:0]  发布于 2003-02-23 14:49:00
yfpw [专家分:0]  发布于 2003-02-23 14:49:00				
				上面的代码有点错误,改正如下:
#define NUM 10
#define REQ 4
int a[NUM-1], b[REQ-1], rand1;
srand(time(NULL));
for(int i = 1; i <= NUM; i++)
     a[i-1] = i;
for(i = 0; i < REQ; i++)
{
  rand1 = rand() % (NUM - i);
  b[i] = a[rand1];
  a[rand1] = a[NUM-i-1];
}
							 
						
				9 楼
				
					 Hanan [专家分:700]  发布于 2003-03-03 21:11:00
Hanan [专家分:700]  发布于 2003-03-03 21:11:00				
				yfpw兄别谦虚嘛!不就是一句“狗熊所食相同”嘛。呵呵,玩笑。
							 
						
				10 楼
				
					 Hanan [专家分:700]  发布于 2003-03-03 21:13:00
Hanan [专家分:700]  发布于 2003-03-03 21:13:00				
				我有个头疼问题。在论坛上留完言之后,第二天总是不容易找到。谁有好主意?
							 
									
			
我来回复