我写了下面的代码来改组一副牌:
int i,j;
for(int x=1;x<53;x++) {
i=rand()%4;
j=rand()%13;
if(deck[i][j]=0)
deck[i][j]=x;
else
x--;
}
这没有产生任何结果,而以下代码产生了结果:
int i,j;
for(int x=1;x<53;x++) {
do {
i=rand()%4;
j=rand()%13;
} while(deck[i][j]!=0);
deck[i][j]=x
}
这有什么不同?
答案 0 :(得分:7)
我没有完全看你的逻辑,但是if(deck[i][j]=0)
闻起来像是一个问题。您的意思是if(deck[i][j]==0)
吗?
编辑现在看着它,我不确定你是如何得到答案的。底部循环是选择一个随机的i和j值,并确保deck[i][j]
为0(或我猜是NULL)。当它为[i] [j]找到NULL值时,它会将x分配给它。
在你的循环中,如果deck [i] [j]不为null,则递减x(假设你的意思是==
,我认为你这样做了)。底部循环不会触及身体内部的任何位置 - 仅在for条件下。你为什么决定递减x?
答案 1 :(得分:5)
问题是,在你的
中if(deck[i][j]=0)
你使用=而你必须使用==
赋值运算符(=)的结果是对指定对象的引用,在这种情况下,它是对deck[i][j]
的引用,您只需将其设置为0.因此,就像您编写if(0)
一样或if(false)
。这就是你的if代码永远不会执行的原因。 HTH
* 请注意,在C ++中我们有std::random_shuffle函数,该函数位于<algorithm>
标题*
答案 2 :(得分:4)
if(deck[i][j]=0)
不是比较,请使用==
(它现在是一个赋值,并且始终为false - (a=b)
的值为b
,在这种情况下,b为0,0为false)
答案 3 :(得分:0)
替换
if(deck[i][j]=0) //assigns 0 to deck[i][j]
这一行
if(deck[i][j]==0)
答案 4 :(得分:0)
由于使用赋值而不是比较,您的第一个循环将永远继续。 “if”将始终评估为false(遗憾的是,int很容易降级为bool),因此x将每个循环递减到原来的位置。
在任何情况下,虽然这是一种非常低效的混乱方式,因为你以后会遇到很多碰撞。你应该做的是从0到x中选择一个随机数,x减少,然后用未洗过的包开始,将下一个空白空间换成位于该位置的卡。
即:
从包含52个空格的包开始,其中位置0保持0,位置1保持1等。
选择0到51(含)之间的数字。 无论出现什么数字,交换51号位置(即51位)的内容。例如,如果你得到17,将17放入单元格51并将51移动到单元格17中。
现在从0到50选择一个数字。用位置50等交换它
答案 5 :(得分:0)
if(deck[i][j]=0)
这就是问题所在。你想写==
。
这就是为什么有些指南建议人们应该将其写成,
if( 0 == deck[i][j] )
因为在编译时会发现意外错误。我的意思是如果你错误地写=
而不是==
,代码甚至都不会编译!