以下是引用nbaqqqq在2011-1-15 22:56:17的发言:
#define SWAP(a, b, _t) do{_t t = a; a = b; b = t; }while(0)
怎么有这种写法?哪本书上的?求书名
这样写是为了让SWAP看上去像一个语句,因为最后会强制需要一个分号。
C++里面其实用模板更好,不过C语言没有。
lz最后那个算法,本质上就是做选取。也就是说,如果你有一堆牌,要打乱。那个错误的方法,就是在牌堆里面不停地交换,这样会导致分布不均。lz提供的正确的做法,本质上就是就是建立另一堆牌(最开始为空)
1.在牌堆里面随机抽一张,放在另一堆牌上
2.如牌堆不为空,goto 1
这样,最后得到的另一堆牌也是随机的,并且分布和n!相符合。