C 我应该用什么来代替goto语句? srand(时间(空)); 对于(i=0;isrand(time(NULL)); 对于(i=0;i

C 我应该用什么来代替goto语句? srand(时间(空)); 对于(i=0;isrand(time(NULL)); 对于(i=0;i,c,C,您不希望随机生成每个数字。您希望以某种随机顺序将数字从0洗牌到8 一种简单得多的方法(也消除了使用goto)是从一个排序的数组开始,选择一个索引,在每次迭代中随机交换 srand(time(NULL)); for(i=0;i<9;i++) { temp=rand()%9; for(j=0;j<=i;j++) { if(temp==randarr[j]) { break; } }

您不希望随机生成每个数字。您希望以某种随机顺序将数字从0洗牌到8

一种简单得多的方法(也消除了使用
goto
)是从一个排序的数组开始,选择一个索引,在每次迭代中随机交换

srand(time(NULL));
for(i=0;i<9;i++)
{
    temp=rand()%9;
    for(j=0;j<=i;j++)
    {
        if(temp==randarr[j])
        {
           break;
        }
    }
    if(j > i) 
        randarr[i]=temp;
    else 
      i--;
}
srand(时间(空));
int randarr[]={0,1,2,3,4,5,6,7,8};
对于(int i=0;i<9;++i)
{
int swap_idx=rand()%9;
int temp=randarr[swap_idx];
randarr[swap_idx]=randarr[i];
randarr[i]=温度;
}

正如HolyBlackCat所指出的,朴素的方法倾向于给出各种排列的非均匀分布。如果这是您关心的问题,可以通过

srand(时间(空));
int randarr[]={0,1,2,3,4,5,6,7,8};
对于(int i=0;i<9;++i)
{
int swap_idx=i+rand()%(9-i);
int temp=randarr[swap_idx];
randarr[swap_idx]=randarr[i];
randarr[i]=温度;
}
srand(时间(空));
i=0;
而(i<9)
{
temp=rand()%9;
性别歧视=0;

对于(j=0;j来说,正如另一个答案中所指出的,随机选择数字0-8是一种非常糟糕的方法。你应该随机洗牌它们

但是,如果您发现自己遇到了类似的问题,似乎需要执行
转到
,则始终可以通过设置标志来删除这些问题。例如:

srand(time(NULL));
i = 0;
while(i < 9)
{
    temp = rand() % 9;
    int doesExist = 0;
    for(j = 0; j <= i; j++)
    {
        if(temp == randarr[j])
        {
            doesExist = 1;
            break;
        }
    }

    if (doesExist == 0)
    {
        randarr[i] = temp;
        i++;
    }
    //printf("%d ",randarr[i]);
}
但我会避免向后跳(就像您最初的代码那样)。

  • 内环中的条件应为
    j
    ,尚未分配randarr[i]
  • 不需要指示器变量,您可以通过
    j!=i
    在内部循环之后检测内部循环的中断

(i=0;i<9;)的
{
int temp=urand(9);/*待提供*/

对于(j=0;j从内部循环中断
,或使用另一个循环嵌套。@sinsuren:你错了。如果你只是从内部循环中断,你仍然会分配给
randarr
并递增
i
@Martinbonner我意识到了我的错误。。谢谢。
goto
允许A)用于错误处理或b)中断嵌套循环。(a.用于没有结构化错误处理的语言,如C。)@PaulOgilvie:我很少发现自己中断嵌套循环,而且通常设置某种标志(或者只设置
返回
)很方便.OTOH,当我用C编写代码时,我几乎总是使用goto来处理错误。也许你应该用Fisher-Yates shuffle重写它?这段代码似乎生成了非均匀分布。@HolyBlackCat-原来的一段也可以。我不是为了提高分布的质量,而是为了便于实现。@HolyBlackCat-But我把那张便条加上了你的署名,谢谢。我没有投反对票,但这是一个只使用代码的答案的快速修正
srand(time(NULL));
int randarr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
for(int i = 0; i < 9; ++i)
{
    int swap_idx = rand() % 9;
    int temp = randarr[swap_idx];
    randarr[swap_idx] = randarr[i];
    randarr[i] = temp;
}
srand(time(NULL));
int randarr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
for(int i = 0; i < 9; ++i)
{
    int swap_idx = i + rand() % (9 - i);
    int temp = randarr[swap_idx];
    randarr[swap_idx] = randarr[i];
    randarr[i] = temp;
}
srand(time(NULL));
i = 0;
while(i < 9)
{
    temp = rand() % 9;
    int doesExist = 0;
    for(j = 0; j <= i; j++)
    {
        if(temp == randarr[j])
        {
            doesExist = 1;
            break;
        }
    }

    if (doesExist == 0)
    {
        randarr[i] = temp;
        i++;
    }
    //printf("%d ",randarr[i]);
}
srand(time(NULL)); // Make sure you only execute this *ONCE* per program.
                   // Do not put it inside a function called repeatedly, or a loop.

for(i=0;i<9;) {
    int temp=rand()%9;
    bool matched = false;
    for(j=0;j<=i;j++) {
        if(temp==randarr[j]) {
            matched = true;
            break;
        }
    }
    if (! matched) {
        randarr[i]=temp;
        i++;
    }
}
     // acquire resources 
     ...

     // do work
     ret = function(...);
     if (ret) goto error:
     ....

     // release resources
 error:
     ....
     return ret;
for(i=0; i < 9;) {
    int temp=urand(9);  /* to be supplied */
    for(j=0; j < i; j++ ) { /* Note j< i, *NOT* j<= i */
        if(temp==randarr[j]) break;
        }
    if ( j != i) continue; /* inner loop ended prematurely */
    randarr[i]=temp;
    i++;
    }
}
for(i=0; i < 9; ) {
    randarr[i] = urand(9);  
    for(j=0; j < i; j++ ) { 
        if(randarr[j] == randarr[i]) break;
        }
    if (j != i) continue; /* inner loop ended prematurely */
    i++;
    }
}