我正在尝试随机化一个数组,我已经成功完成了它。但它需要花费10秒钟才能输出16(PLAYERS
)个数字并使用99%的CPU!
为什么?
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define PLAYERS 16
void getNames(char names[PLAYERS][NAME_LEN])
{
int x, y[PLAYERS] = {16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16},
z, a = 1,
b = 0;
char tempNames[PLAYERS][NAME_LEN];
while (a == 1)
{
srand ( time(NULL) );
int random_number = rand() % PLAYERS;
while (1)
{
if (y[b] == random_number)
{
break;
}
else
{
b++;
strcpy(tempNames[b - 1], names[random_number]);
y[b] = random_number;
if (b == PLAYERS)
{
a = 0;
/*Move temp array back to the original array*/
for (z=0; z<PLAYERS; z++) {
strcpy(names[z], tempNames[z]);
}
}
}
}
}
}
我刚才注意到这段代码没有为每个随机数选择一个原始值!
答案 0 :(得分:1)
部分问题是你继续播种随机数发生器;将呼叫移到循环外的srand
。
这可能不会减慢太多的速度,但你的内循环不应该是一个循环;要么它中断,要么设置条件导致下一次迭代中断。
这里的东西很多更简单:
srand ( time(NULL) );
char tempname[NAME_LEN];
for ( a = PLAYERS-1; a>0; a-- ) {
// Pick a position to swap with last name
int r = rand() % (a+1);
if ( r == a )
continue;
// Swap names[a] and names[r]
strcpy( tempname, names[r] );
strcpy( names[r], names[a] );
strcpy( names[a], tempname );
}
答案 1 :(得分:0)
您已增加b
,然后在检查其范围之前使用。所以当b == PLAYERS
你已经损坏了别的东西时。
b++;
...
y[b] = random_number;
if (b == PLAYERS)
答案 2 :(得分:0)
首先,让我陷入困境的事情与你的问题无关。
while(a==1)
?递增b
是否永远不会等于PLAYERS
?真的不应该。那个循环和旗帜可以被砍掉。 你得到一个随机数,如果NEXT索引处的数组等于这个随机数,将数组指向数字,然后做东西,则退出。
我相信你因为运气而退出了内在的永恒循环。
调试它,并在b == PLAYERS
时中断。看看下一次迭代会发生什么。当你想要它时它会退出循环吗?