Delphi Can

Orjinalini görmek için tıklayınız: uluslararası kumar sabiti bulma craps oyunu
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Merhaba,
C kursunda yazdığımız ve hoşuma giden bir örneği paylaşmak istiyorum
oyunun uzunca açıklaması https://en.0wikipedia.org/wiki/Craps
kısaca iki zar atıyorsunuz atığınız zarın toplamı 7 veya 12 ise kazanıyorsunuz eğer 2 ,3,12 ise kasa kazanıyor diğer sayılar geldiğinde örnek 6 atınız burada oyunun kuralları değişiyor ve kural atığınız zarın aynısını atana tekrar zar atabiliyorsunuz taki 6 gelene kadar 6 gelirse kazanıyorsunuz ama bu seferde 7 gelirse kasa kazanıyor anlatamamış olabilirim ama kodu görünce daha iyi anlayabilirsiniz.
Bizim burada yapacağımız şey ise 100000000 (yüz milyon) kere oynadığımızda ki kazanma olasılığımızı hesaplama
Gelelim koda

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
 System.SysUtils,System.Math;

function roll_dice:Integer;
var
dice1,dice2:Integer;
begin
dice1:=RandomRange(1,7);
dice2:=RandomRange(1,7);
Result:=dice1+dice2;
end;


function game_(dice : Integer):Integer;
var
new_dice:Integer;
begin

while True do
begin
 new_dice:=roll_dice;
 if new_dice=7    then
 begin
   Result:=0;
   Break;
 end;
 if new_dice=dice then
   begin
   Result:=1;
   Break;
   end;

end;

end;



function game: integer;
var
dice:Integer;
begin
dice:=0;
dice:=roll_dice;

case dice of
7:Result:=1;
11:Result:=1;
2:Result:=0;
3:Result:=0;
12:Result:=0;
else Result:=game_(dice);

end;

end;


var
win_cnt,
i:LongInt;
begin
 try

   win_cnt:=0;

     for i := 1 to 100000000  do
     begin
      win_cnt:=win_cnt+game;
     end;
     Writeln('kazanma olasiliginiz :' ,win_cnt / i:0:12);
     Readln;
 except
   on E: Exception do
     Writeln(E.ClassName, ': ', E.Message);
 end;
end.

şimdide kursta yazdığımız c kodunu ekliyorum compile edecek araçlarınız var ise compile edip hız farkını yorum olarak eklemeyi unutmayın

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


#define     NGAMES 100000000

int game_(int dice)
{
int new_dice;

for ( ; ; ) {
new_dice = roll_dice();
if (new_dice == 7)
return 0;

if (new_dice == dice)
return 1;
}
}

int roll_dice()
{
int dice1 = rand() % 6 + 1;
int dice2 = rand() % 6 + 1;

return dice1 + dice2;
}

int game()  //returns 1 if player wins returns 0 otherwise
{
int dice = roll_dice();

switch (dice) {
case 7:
case 11: return 1;
case 2:
case 3:
case 12: return 0;
default: return game_(dice);
}
}


int main()
{
int win_cnt = 0;

for (int k = 0; k < NGAMES; ++k) {
win_cnt += game();
}

printf("kazanma olasiliginiz : %0.12f\n", (double)win_cnt / NGAMES);
system("pause");

return 0;
}
Bilgisayarı kapattım,telefondan yazıyorum,yarın deneyip sonucunu yazacağım.Bir de fikrimce ,main'in içine srand(time(0)) fonksiyonunu koyarsanız rand fonksiyonu daha sağlıklı çalışacaktır.iyi geceler.
Test Ortamı :
Delphi 10.2
Intel® Core™ i7-6700HQ CPU @ 2.60GHz



09:05:27
kazanma olasiliginiz :0.492944175071
09:05:31
milisn: 4847


Süre ölçümü için aşağıdaki küçük değişikliği yaptım.



     starttime := now();
    writeln(timetostr(now));
    for i := 1 to 100000000  do
    begin
     win_cnt:=win_cnt+game;
    end;
    Writeln('kazanma olasiliginiz :' ,win_cnt / i:0:12);
    writeln(timetostr(now));
    stoptime := Now();

    fark := MilliSecondsBetween(stoptime,starttime);
    writeln('milisn: ' + inttostr(fark));

    Readln;
Denedim İşte Sonuçlar:
[attachment=158]
[attachment=159]
[attachment=160]
[attachment=161]

Not:Elementary os'un üzerinde windows'u sanal olarak kullanıyorum.