Mekatronik Mühendisliği Forum


c ile ilgili yardım. Örnek soru
Değerlendir:
  • 0 Oy - 0 Yüzde
  • 1
  • 2
  • 3
  • 4
  • 5


Konu: 4
Mesaj: 22
Cinsiyet: Erkek
Kıdem: Jul 2013

Merhaba arkadaşlar. C ' de bir soru ile ilgili kod yazmaya çalışıyordum. Kodu bitirdim. Bir sorunum var kodda. Öncelikle yazdığım program bir olasılık hesapla programı.
soru şu:
Bu oyun tombalada oynanan oyunlardan biridir. Oyun şöyledir: oyuncu önce içinde 1 ile 90 arasında 90 taşın bulunduğu torbadan 60 taş çeker. Sonra da tombalacıdan üzerinde 5 farklı sayı bulunan kartlardan bir tane çeker. Eğer 60 sayı içerisinde karttaki 5 sayıyı bulursa kazanır, yoksa kaybeder.

Program rasgele sayı üreterek bu oyunu 100000 defa oynuyor ve kazanma olasılığı hesaplanıyor.


evet soru bu. ben yazdığım kodda 10000 defa tekrarlayıp kaç kere kazandığını ekrana yazdırıyorum.


kod:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>


int main()
{
int cekilen[60];
int hepsi[90];
int kart[5];
int i,a,j,k,x=0,sayac;
int sayici=0;

srand(time(NULL));

for(sayac=0;sayac<10000;sayac++)//kazanma olasılığını hesaplamak için
//100000 defa tekrarla
{

for(i=0;i<90;i++)
hepsi[i]=0;

for(i=1;i<=90;i++)//sayııları rastgele dağıt
{
a=rand()%90;
if(hepsi[a]==0)
hepsi[a]=i;
else i--;

}

printf("\nCEKTIGINIZ TASLAR: \n\n");

for(i=0;i<60;i++) //dağıttığın kartların 60 tanesini seç
printf("%d,",hepsi[i]);

for(i=0;i<5;i++)
kart[i]=0;


for(i=0;i<5;i++) //5 sayı bulunan kartları seç
{
kart[i]=rand()%90+1;
for(j=0;j<i;j++)
{
if(kart[i]==kart[j])
i--;
}

}

printf("\n\nSECTIGIN KART BESLISI:\n");
for(i=0;i<5;i++)
printf("%d,",kart[i]);


for(i=0;i<5;i++)//seçtiğin 5 rakam 60 taşın içinde var mı kontrol et
{
for(j=0;j<60;j++)
{
if(kart[i]==hepsi[j])
{
sayici=sayici+1;
}

}
}

if(sayici==5) //eğer 5 sayi varsa kazanır.
{
printf("\noyunu kazandin");
x=x+1;

}

else
printf("\nkaybettin\n");
}


printf("\ntoplamda %d kere kazandin\n", x);//x toplamda kaç kere kazandığını gösterir.



getchar();

return 0;


}

benim sorunum bu oyunu 1000 defada döndürsem 100000 defada döndürsem toplamda sadece 1 kere kazandığımı ekrana yazdırıyor. yazdığım kod biraz karışık olabilir. sorunu hallettikten sonra kodu fonksiyonlara bölüp tekrar düzenleyeceğim. Sizden şimdilik yardımlarınızı bekliyorum herhangi bir hatam varsa.
YILDIZ TEKNİK ÜNİVERSİTESİ-MEKATRONİK MÜHENDİSLİĞİ[/font]

Cevapla
Teşekkür Edenler
.
Konu: 25
Mesaj: 192
Cinsiyet: Belirtme
Kıdem: Apr 2013

burada x kazanma adedi... 10000 defa olan döngü içine o koşulu sokman gerek..

yani her oyunda sorgulaman gerek bu sorguyu

if(sayici==5) //eğer 5 sayi varsa kazanır.
{
printf("\noyunu kazandin");
x=x+1;

}


sen burada oyunu 10000 defa oynuyor sadece son oyundakini sorguluyorsun..
Sakarya Üniversitesi > Teknoloji Fakültesi > Mekatronik Mühendisliği
Linki görebilmek için giriş yapmanız ya da üye olmanız gerekir.
Linki görebilmek için giriş yapmanız ya da üye olmanız gerekir.

Mekatronik, elektroniğe beden makineye beyindir.

Cevapla
Teşekkür Edenler
.
Konu: 4
Mesaj: 22
Cinsiyet: Erkek
Kıdem: Jul 2013

Ama zaten o koşul döngünün içerisinde ki..her oyun sonunda o koşul kontrol ediliyor. ben zaten ilk başta sadece 1 kere oynanabiliyormuş gibi yazdım kodu.. sonradan tüm kodu for döngüsüne alıp 10000 kere tekrar ettirdim. Sonuç olarak her turda o koşulu kontrol etmez mi?
YILDIZ TEKNİK ÜNİVERSİTESİ-MEKATRONİK MÜHENDİSLİĞİ[/font]

Cevapla
Teşekkür Edenler
.
Konu: 5
Mesaj: 30
Cinsiyet:
Kıdem: Aug 2013

*rand() fonksiyonu aynı sayıları üretebilir, bunun filtre edilmesi gerekir.
*Zaten 1-90 arası sayı olduğundan tekrar 90 adet sayı üretmeye gerek yok.
*Cekilen taşlar için 60 tane birbirinden farklı sayı üretmek kafidir.
*Ayriyeten kart numarası içinde 5 adet ayrı sayı üretilmelidir ve bunlar birbirinden farklı olmalıdır.
*Ben kendi yazdığım bi algoritmayı aşağıda paylaştım, code blocks da derleyemedim program kurulu olmadığından. Hatalar çıkabilir(Türkçe karakter yada parantez hatası gibi)
*Umarım faydalı olur, anlamadığınız yer olursa sorabilirsiniz.

Algoritma şu şekilde;

int sayac=0,sayac2=0,rastgeleSayi=0,tuttu=0,kazananKart=0;
int cekilen[60],kartNo[5];
float olasılık=0;
srand(time(NULL));
//Olasılığın bulunması için olay 100000 kez tekrar ediliyor
while(sayac<100000)
{
//Çekilecek olan 60 adet numara belirleniyor
while(sayac<60)
{
rastgeleSayi=rand()%91
if(rastgeleSayi==0)
{
rastgeleSayi=1;
}
for(int i=0;i<sizeof(cekilen);i++)
{
if(cekilen[sayac]==rastgeleSayi)
{
sayac--;
}
if(cekilen[sayac]!=rastgeleSayi)
{
cekilen[sayac]=rastgeleSayi;
}
}
sayac++;
}
//Kartın üzerinde bulunacak olan 5 adet numara belirleniyor.
while(sayac2<5)
{
rastgeleSayi=rand()%91
if(rastgeleSayi==0)
{
rastgeleSayi=1;
}
for(int i=0;i<sizeof(kartNo);i++)
{
if(kartNo[sayac2]==rastgeleSayi)
{
sayac2--;
}
if(kartNo[sayac2]!=rastgeleSayi)
{
cekilen[sayac2]=rastgeleSayi;
}
}
//Çekilen ve kart üzerindeki numaralar karşılaştırılarak kart sahibinin kazanıp kazanmadığı kontrol ediliyor.
for(int i=0;i<90;i++)
{
for(int j=0;j<5;j++)
{
if(cekilen[i]==kartNo[j])
{
tuttu++;
}
}
}
//Eğer numaraların hepsi uyuşuyorsa kazanan olasılığa bir ekleniyor.
if(tuttu==5)
{
kazananKart++;
}
}
//Ana while döngüsü bittikden sonra olasılık hesaplanıyor.
olasılık=kazananKart/1000;
printf("Oyuncunun Kazanma Olasılığı = \% %f dir.\n",olasılık);

Cevapla
Teşekkür Edenler
(Bu mesajı son düzenleyen: 10-08-2013, 13:33 PM birisi.) .
Konu: 25
Mesaj: 192
Cinsiyet: Belirtme
Kıdem: Apr 2013

evet rand() komutunun öyle bir sıkıntısı vardı.. sürekli aynı değeri üretiyordu... bunu önlemek için bir yöntem vardı ama şu an hatırlayamadım ... biraz araştıralım bakalım bulabilecekmiyiz Big Grin
Sakarya Üniversitesi > Teknoloji Fakültesi > Mekatronik Mühendisliği
Linki görebilmek için giriş yapmanız ya da üye olmanız gerekir.
Linki görebilmek için giriş yapmanız ya da üye olmanız gerekir.

Mekatronik, elektroniğe beden makineye beyindir.

Cevapla
Teşekkür Edenler
.
Konu: 4
Mesaj: 22
Cinsiyet: Erkek
Kıdem: Jul 2013

senin algoritmanda benimkinden pek farklı değil.. Baya araştırdım bu rand() fonksiyonunu ama bişey bulamadım. hala çözümünü bulabilmiş değilim.Bu oyunda kazanma olasılığı baya bi düşük heralde başka açıklaması yok Smile
YILDIZ TEKNİK ÜNİVERSİTESİ-MEKATRONİK MÜHENDİSLİĞİ[/font]

Cevapla
Teşekkür Edenler
.
Konu: 25
Mesaj: 192
Cinsiyet: Belirtme
Kıdem: Apr 2013

rand fonksiyonu yanında başka bir fonksiyon daha kullanılıyordu diye hatırlıyorum...
Sakarya Üniversitesi > Teknoloji Fakültesi > Mekatronik Mühendisliği
Linki görebilmek için giriş yapmanız ya da üye olmanız gerekir.
Linki görebilmek için giriş yapmanız ya da üye olmanız gerekir.

Mekatronik, elektroniğe beden makineye beyindir.

Cevapla
Teşekkür Edenler
.
Konu: 4
Mesaj: 22
Cinsiyet: Erkek
Kıdem: Jul 2013

srand(time(NULL)) bunu diyosan zaten kullandım ben bunu.. aynı sayıları üretmesini engellemek için kullandım. ama başka fonksiyon kullanılıyor mu bilmiyorum.
YILDIZ TEKNİK ÜNİVERSİTESİ-MEKATRONİK MÜHENDİSLİĞİ[/font]

Cevapla
Teşekkür Edenler
.
Konu: 5
Mesaj: 30
Cinsiyet:
Kıdem: Aug 2013

srand(time(NULL)) fonkisyonu aynı sayıları üretmesini önlemez, sadece arka arkaya aynı sayıları üretmesini önler.
Biliyorsam Öğretirim, Öğretirsen Öğrenirim. Shy

Cevapla
Teşekkür Edenler
.
Konu: 4
Mesaj: 22
Cinsiyet: Erkek
Kıdem: Jul 2013

Söylemek istediğim oydu. Evet arka arkaya aynı sayıların oluşmasını engelliyor.
YILDIZ TEKNİK ÜNİVERSİTESİ-MEKATRONİK MÜHENDİSLİĞİ[/font]

Cevapla
Teşekkür Edenler
.


Benzeyen Konular
Konu: Yazar Cevaplar: Gösterim: Son Mesaj
  Dizilerle İlgili Örnek Soru Ali Ozcelik 0 697 20-05-2016, 22:13 PM
Son Mesaj: Ali Ozcelik
  Mikroişlemci ile ilgili Acil!! ciriuc54 0 1,171 15-12-2014, 13:11 PM
Son Mesaj: ciriuc54

Foruma atla:


Konuyu görüntüleyenler: 1 Misafir

Türkçe Çeviri : MyBB Türkiye
MyBB, © 2002-2017 MyBB Group.