2011-03-07 80 views
0

我写了下面的代码洗牌一副纸牌:For循环不表现为预期没有嵌套的DO-而

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

你是什么意思*没有产生任何结果*?你在期待什么,实际发生了什么? – 2011-03-07 14:28:30

+2

'if(deck [i] [j] = 0)'是赋值,因此总是为真,使用比较运算符'=='并再次检查。 – sled 2011-03-07 14:28:44

+0

@sled,你是不是故意“因此总是虚假”? – 2011-03-07 15:46:31

回答

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]不为空(假设你的意思是==,我认为你做了),那么你将递减x。底部循环在身体内部的任何地方都不会触摸X - 只有在for状态下。你为什么决定减少x?

4

if(deck[i][j]=0)是不是一个比较,使用==

(它现在的任务,始终假 - 的(a=b)b,在这种情况下,b为0,0是假)

5

的问题是,在你的

if(deck[i][j]=0) 

您使用=,而必须使用==

赋值运算符(=)的结果是对分配对象的引用,在这种情况下,它是对deck[i][j]的引用,您刚刚设置为0.因此,就像您写入if(0)if(false)。这就是为什么你的代码永远不会执行。 HTH

* 作为附带说明,请注意,在C++中,我们std::random_shuffle函数,它是在<algorithm>头*

0

替换

if(deck[i][j]=0) //assigns 0 to deck[i][j] 

与此线

if(deck[i][j]==0) 
0

由于使用赋值而不是比较,你的第一个循环将永远持续下去。 “if”将总是评估为false(可惜int容易退化为bool),所以x会在每个循环中递减到原来的位置。

在任何情况下,尽管这是一种非常低效的洗牌方式,因为您稍后会收到大量冲突。你应该做的是从x到x随机选择一个随着x减小的数字,并且在开始使用一个没有混洗的包后,用位于该位置的卡交换下一个空闲空间。

即:

开始用52位,其中位置0成立0,位置1保持1等

从0至51(含)选择一个号码的包。 无论出现什么号码,请将位置51(这将是51)中的内容与之交换。例如,如果你17,把17到51单元格并移动到51单元17

现在选择从0到50与50位交换了一个数字,等

0
if(deck[i][j]=0) 

这就是问题。你想写==

这就是为什么一些指引建议,应该写为,

if(0 == deck[i][j]) 

因为偶然的错误是在编译时被捕获。我的意思是如果你错误地写了=而不是==,那么代码甚至不会编译!