能力值:
( LV2,RANK:85 )
2 楼
好,就一个字
能力值:
( LV2,RANK:10 )
3 楼
好文章,学习 !
能力值:
(RANK:1060 )
4 楼
模拟洗牌就行了,也不需要52次那么多
能力值:
( LV9,RANK:210 )
5 楼
这种方式下,恐怕无法达到洗乱每一张牌的目的吧? 当然,实际玩牌中,也不可能达到洗乱每一张牌的程度.
能力值:
( LV9,RANK:210 )
6 楼
红心大战的算法倒是蛮高效的。
我本人倒是曾经编写过一些纸牌类型的程序。
最初就是采用LZ所说的“随机发牌无非就是随机产生0..51个随机数,代表52张牌。然后分发给四个玩家。当随机产生0...51之间的随机数时,可能会产生相同的随机数,此时,就要将这种情况去除,并重新产生一个随机数,直到……”很快就发现程序效率非常低下,甚至考虑过某些极限情况,也许永远发不完一副牌。
后来采用的链表,但是效率并不理想。
最后就采用和红心大战类似的方法,不过有一点不同,抽走每一张牌后,其后的所有牌前进一个位置,然后n-1。模拟手工抽取。。事实上,红心大战的方法效率要更好。
能力值:
(RANK:1060 )
7 楼
先反序,再洗牌。
能力值:
( LV6,RANK:90 )
8 楼
看看VC6的STL部分random_shuffle()算法的源码 原理一模一样
// TEMPLATE FUNCTION random_shuffle
template<class _RI> inline
void random_shuffle(_RI _F, _RI _L)
{if (_F != _L)
_Random_shuffle(_F, _L, _Dist_type(_F)); }
template<class _RI, class _Pd> inline
void _Random_shuffle(_RI _F, _RI _L, _Pd *)
{const int _RBITS = 15;
const int _RMAX = (1U << _RBITS) - 1;
_RI _X = _F;
for (_Pd _D = 1; ++_X != _L; ++_D)
{unsigned long _Rm = _RMAX;
unsigned long _Rn = rand() & _RMAX;
for (; _Rm < _D && _Rm != ~0UL;
_Rm = _Rm << _RBITS | _RMAX)
_Rn = _Rn << _RBITS | _RMAX;
iter_swap(_X, _F + _Pd(_Rn % _D)); }}
template<class _RI, class _Pf> inline
void random_shuffle(_RI _F, _RI _L, _Pf& _R)
{if (_F != _L)
_Random_shuffle(_F, _L, _R, _Dist_type(_F)); }
template<class _RI, class _Pf, class _Pd> inline
void _Random_shuffle(_RI _F, _RI _L, _Pf& _R, _Pd *)
{_RI _X = _F;
for (_Pd _D = 1; ++_X != _L; ++_D)
iter_swap(_X, _F + _Pd(_R(_D))); }
能力值:
( LV9,RANK:210 )
9 楼
谢谢!
感觉好像是那么一回事.
说实话,这种模板类型的代码,我最头痛了,看得不是完全懂
能力值:
( LV9,RANK:170 )
10 楼
没有细读楼主的代码,不知理解的对不?
var
buf,R:array [0..51] of byte; //R用于存取出来的牌,BUF是待发牌
i,j,K:integer;
begin
randomize;
for i:=51 downto 0 do //将每种牌进行排号,放到BUF中的
begin
j:=random(i+1);
R[i]:=Buf[j];
for K:=j to i-1 do //I-1 防出
Buf[k]:=buf[k+1]; //szdbg 提了建议了,俺改进一下.
end;
showmessage('R就是发完的结果,可以13个一组每个人')
end;
----------------------------------------------------------------
var
buf,R:array [0..51] of byte; //R用于存取出来的牌,BUF是待发牌
i,j,K:integer;
begin
randomize;
for i:=51 downto 0 do //将每种牌进行排号,放到BUF中的
begin
j:=random(i+1);
R[i]:=Buf[j];
if i<>j then buf[j]:=buf[i]; //改进之处,看看行不?
end;
showmessage('R就是发完的结果,可以13个一组每个人')
end;
能力值:
( LV9,RANK:210 )
11 楼
[QUOTE=nig;385724] for K:=j to i-1 do //I-1 防出
Buf[k]:=buf[k+1];[/QUOTE]
呵呵,你这和seya所说的方式是一样的,效率和红心大战比起来,稍差一点,红心大战每次在抽出一张牌后,只需移动一张牌,你这里需要移动多张牌...
能力值:
( LV2,RANK:10 )
12 楼
我想问下,如何分析跟踪到随机发牌的地方?
能力值:
( LV4,RANK:50 )
13 楼
想起来大二的时候 老师让我帮他写的随机配对程序了 !!!!! 异曲同工啊
能力值:
( LV9,RANK:210 )
14 楼
能力值:
( LV4,RANK:50 )
15 楼
int player[4][13]; //4个玩家 每个玩家有13张牌
int poker[52];//={0,1,2,3,4,...}; 扑克牌,从0到51
int n;
int rest; //剩余的扑克牌
srand(time(NULL)); //随机初始化
for( int k=0;k<52;k++ )poker[k]=k; //扑克牌,从0到51
for( int i=0;i<4;i++ )
for( int j=0;j<13;j++ )
{
rest=52-i*13-j;
n=rand()%rest; //随机出一个位置,这个位置不能大于剩余牌数
player[i][j]=poker[n]; //某位玩家得到这个位置牌
poker[n]=poker[rest-1]; //把最后的那张牌替换出过的位置牌
}
不知的C语言算法对不对!
能力值:
( LV13,RANK:1050 )
16 楼
楼主,辛苦了。
能力值:
( LV9,RANK:490 )
17 楼
分析不错~~
能力值:
( LV2,RANK:10 )
18 楼
呵呵,不错,支持