2016-03-29 14 views
-3

Ben bir öğrenciyim ve bir ara sınavın ortasındayım. Bunu benim için kodlamak isteyen insanlar aramıyorum ama bunun bir kısmına yardıma ihtiyacım var. Ben bir Blackjack oyunu yapmaya çalışıyorum ve bunu yapmak istiyorum ki, bir iskamedeki her kart için bir tane 52 tam sayı listesi [1,1,1,1,2,2,2,2 .....] . Fakat listeden rasgele bir sayıyı nasıl alır ve iptal eder? Bir kart aldığınızda normal bir güverte gibi onu yeniden çizemezsin. Program için rasgele bir parametre [n = rand()% 11 + 1] ayarlayabileceğimi biliyorum, ancak bir ARasgele Sayılar ön ayar listesinden

cevap

-1

elde etmek için yukarıdaki ve ötesine geçmek istiyorum. Bunun gibi bir karıştırma algoritması kullanabilirsiniz: https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle. Fisher - Yates shuffle bir dizi ile başlar, daha sonra dizinin her öğesini dizi içinden rastgele bir öğe ile değiştirir. Öğeleri birer birer çıkarmak da mümkündür, ancak daha karmaşıktır. Bir ikili ağacı kullanarak öğeleri birer birer rastgele kaldırabilirsiniz. Her düğümün altındaki toplam öğe sayısını saklayın. Her seferinde bir öğeyi kaldırmak için, 0'dan büyük veya ona eşit ve rastgele öğe sayısından daha az rastgele bir sayı üretin. Kökle başla. Sol alt öğenin altındaki öğelerin sayısından azsa, sol çocuğa gidin. Aksi halde, a-, ve doğru çocuğa gidelim. Bunu yinelemeli yapın. Ancak öğeleri tek tek kaldırmak daha karmaşıktır. Bir karıştırma algoritması kullanmak daha iyidir.

1

Bir diziden rasgele bir öğeyi kaldırmanın yolu yoktur.
Bunun yerine, rastgele seçilen öğeyi dizinin son öğesiyle değiştirmektir. Bununla birlikte, array_size_valid değişkeninde dizideki geçerli öğelerinin sayısını saklamanız ve takas işlemi her gerçekleştiğinde bu değeri azaltmanız gerekir.

rastgele indeks oluşturma işlevi olacak konum Bu şekilde: Burada

1

rand_index = rand() % array_size_valid; bir önemsiz yoludur:

int deck[52]; 

Ve: 52 tamsayılar içeren, bir dizi var ki 1, 1, 1, 1, 2, 2, 2, 2, .....

İstediğiniz değere ilklendirdiğinizde, bir kart çizildiğinde ilgili diziyi e elemanının net -1 (veya orijinal dışındaki herhangi bir değer):

int drawCard(int deck[]) 
{ 
    do{ 
     int randIndex = rand() % 52; 
    } while(deck[randIndex] == -1); 

    int drawnCard = deck[randIndex]; 
    deck[randIndex] = -1; 
    return drawnCard; 
} 

bu yaklaşım yeterince verimli olmayabilir rağmen, çalışır, bu yüzden sizin gibi yeni başlayanlar için yararlı olabilir düşünüyorum.

+0

Tam olarak aradığım şey teşekkür ederim. – jojobuddy13

+0

@ jojobuddy13 Sorunu çözdüğünü düşünüyorsanız lütfen bu cevabı kabul edin :) –

+0

Bu sonsuz bir döngüye girme olanağına sahiptir. –