随机化结果在数组中

时间:2014-11-18 20:30:34

标签: c arrays random

我正在尝试随机化一个数组,我已经成功完成了它。但它需要花费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]);
                }
            }
        }
    }
}
}

修改

我刚才注意到这段代码没有为每个随机数选择一个原始值!

3 个答案:

答案 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循环条件。
  • 为什么第一个循环存在? while(a==1)?递增b是否永远不会等于PLAYERS?真的不应该。那个循环和旗帜可以被砍掉。

你得到一个随机数,如果NEXT索引处的数组等于这个随机数,将数组指向数字,然后做东西,则退出。

我相信你因为运气而退出了内在的永恒循环。

调试它,并在b == PLAYERS时中断。看看下一次迭代会发生什么。当你想要它时它会退出循环吗?