回 帖 发 新 帖 刷新版面

主题:要在1-10之间找4个不重复的随机数。请教!

    在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个回复)

沙发

可以用循环来做
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
不过这样的代码更加长

板凳

senna兄的回答很精彩呀!

3 楼

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 楼

每次判断的话,速度很慢,以前我编个程序,要选近万不重复的随机号,后来发觉太慢。

换个思路是这样的,用一个数租,里面放顺序的数,用随机变量ran = 100 Mod num指定下标,一开始num是10,每次选中的arr[ran]拿出来用,再arr[ran] = arr[num],然后num = num - 1,接着一直循环下去。

这样一来速度很快。

5 楼

转换成二进制,进行异或运算

6 楼

int a[3] = {0};
srand(time(NULL));

while(!a[3])
{

7 楼

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 楼

上面的代码有点错误,改正如下:
#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 楼

yfpw兄别谦虚嘛!不就是一句“狗熊所食相同”嘛。呵呵,玩笑。

10 楼

我有个头疼问题。在论坛上留完言之后,第二天总是不容易找到。谁有好主意?

我来回复

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