主题:要在1-10之间找4个不重复的随机数。请教!
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
可以用循环来做
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
senna兄的回答很精彩呀!
3 楼
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
每次判断的话,速度很慢,以前我编个程序,要选近万不重复的随机号,后来发觉太慢。
换个思路是这样的,用一个数租,里面放顺序的数,用随机变量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
转换成二进制,进行异或运算
6 楼
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
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
上面的代码有点错误,改正如下:
#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
yfpw兄别谦虚嘛!不就是一句“狗熊所食相同”嘛。呵呵,玩笑。
10 楼
Hanan [专家分:700] 发布于 2003-03-03 21:13:00
我有个头疼问题。在论坛上留完言之后,第二天总是不容易找到。谁有好主意?
我来回复