2010-11-02 7 views
12

Sto facendo una classe Deck per un programma C++. Deve avere due metodi: uno per estrarre una carta dalla cima del mazzo, un'altra per mescolare il mazzo. Sono interessato a quest'ultimo.Mischiare un mazzo di carte

Le carte sono rappresentate come numeri interi da 1 a 52 inclusi. Qual è l'algoritmo più veloce per mescolare il mazzo (assumendo un "buon" livello di casualità)?

risposta

26

Se si desidera implementare lo shuffle da soli, un algoritmo di shuffling molto semplice ma anche funzionale: Fisher–Yates shuffle.

per mischiare un array a di n elementi:

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

Naturalmente, la libreria standard C++ ha anche cose come questa implementato per te, quali std::random_shuffle, incluso tramite l'intestazione <algorithm>.

+0

(Per inciso, io sono abbastanza sicuro che l'implementazione standard di 'std :: random_shuffle' * è * uno shuffle Fisher-Yates.) – Amber

+1

Shuffle è facile ** una volta ** sai come farlo. È molto facile sbagliare se non hai studiato la casualità in una classe di matematica. –

+0

@Martin: è molto facile sbagliare se non è possibile seguire semplici istruzioni ;-p –

8

Usa std::random_shuffle per mischiare il mazzo.

0

Ecco il mio codice

#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); 
}