2010-11-02 40 views
12

Estoy haciendo una clase Deck para un programa en C++. Necesita tener dos métodos: uno para sacar una carta de la parte superior de la baraja y otra para barajar la baraja. Me preocupa lo último.Mezclar una baraja de cartas

Las tarjetas se representan como los números enteros del 1 al 52 inclusive. ¿Cuál es el algoritmo más rápido para barajar el mazo (suponiendo un "buen" nivel de aleatoriedad)?

Respuesta

26

Si desea implementar la mezcla usted mismo, un algoritmo de barajado muy sencillo pero funcional: Fisher–Yates shuffle.

a barajar una matriz A de n elementos:

for i from n − 1 downto 1 do 
    j ← random integer with 0 ≤ j ≤ i 
    exchange a[j] and a[i] 

Por supuesto, la biblioteca de C++ estándar también tiene cosas como esta implementado para usted, como std::random_shuffle, incluido a través de la cabecera <algorithm>.

+0

(Dicho sea de paso, estoy bastante seguro de que la implementación estándar de 'std :: random_shuffle' * * es un shuffle de Fisher-Yates.) – Amber

+1

aleatoria es fácil ** una vez ** sabes cómo hacerlo. Es muy fácil equivocarse si no ha estudiado la aleatoriedad en una clase de matemáticas. –

+0

@Martin: es muy fácil equivocarse si no puede seguir instrucciones simples ;-p –

8

Uso std::random_shuffle a barajar los naipes.

0

Aquí está mi código

#include<stdlib.h> 
#include<iostream> 
using namespace std; 
int b[52],count=0; 
int check(int k) 
{  int i=0; 
    while(b[i++]!=-1) 
    { 
    if(b[i]==k) 

> Blockquote 

    return 0;} 
    b[count++]=k; 
    cout<<k<<endl; 
    return 1; 

} 
void random(int a[]) 
{ 

    int i=0,p=0,k=0; 
    for(i=1;i<52;i++) 
    { srand(rand()%9); 
    k=0; 
     while(!k) 
     { 
    p=rand()%52; 
    k=check(p); 
     } 
    } 

} 
int main() 
{ 
    int n=52,i=0,arr[n]; 
    for(i=0;i<52;i++) 
    {arr[i]=i;b[i]=-1; } 
    random(arr); 
}