C 我应该用什么来代替goto语句? srand(时间(空)); 对于(i=0;isrand(time(NULL)); 对于(i=0;i
您不希望随机生成每个数字。您希望以某种随机顺序将数字从0洗牌到8 一种简单得多的方法(也消除了使用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; } }
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++;
}
}