2010-11-02 17 views
12

Tworzę klasę Deck dla programu C++. Musi mieć dwie metody: jedną do wyrzucenia karty z wierzchu talii, drugą do przetasowania talii. Martwię się tym drugim.Tasowanie talii kart

Karty są reprezentowane jako liczby całkowite od 1 do 52 włącznie. Jaki jest najszybszy algorytm przetasowania talii (zakładając "dobry" poziom losowości)?

Odpowiedz

26

Jeśli chcesz samemu przeprowadzić przetasowanie, bardzo prosty, ale również funkcjonalny algorytm przetasowania: Fisher–Yates shuffle.

Aby przetasować tablicę z elementów n:

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

Oczywiście, C++ Standardowa biblioteka posiada również takie rzeczy jak ten realizowany dla Ciebie, takie jak std::random_shuffle, zawarte za pośrednictwem nagłówku <algorithm>.

+0

(Tak na marginesie, jestem pewny, że średnia realizacja 'std :: random_shuffle' * jest * Fisher-Yates shuffle.) – Amber

+1

Shuffle jest łatwe ** raz ** wiesz, jak to zrobić. Bardzo łatwo jest popełnić błąd, jeśli nie studiowałeś przypadkowości w klasie matematycznej. –

+0

@Martin: bardzo łatwo jest się pomylić, jeśli nie możesz wykonać prostych instrukcji ;-p –

8

Zastosowanie std::random_shuffle tasować talię.

0

Oto mój kod

#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); 
} 
Powiązane problemy