Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Losowa liczb
Forum PHP.pl > Forum > Przedszkole
Ulysess
dzień dobry , posiadam 'grę' internetowa i w niej gracze mogą ulepszać swoje przedmioty , szanse na ulepszenie teoretycznie powinny wynosić 90% a w praktyce to działa na zasadzie

  1.  
  2. mt_srand((double)microtime()*1000000);
  3.  
  4. $liczba_rand = round(rand(101,10000)/100);
  5.  
  6. if(90 >= $liczba_rand)
  7. {
  8. przedmiot ulepsza sie
  9. }
  10. else
  11. {
  12. niszczy
  13. }


wydaje mi się że tak naprawdę szanse nie wynoszą 90% dlatego wpadłem na pomysł aby:
Losowanych było 10 różnych liczb z przedziału od 1 do 100
Następnie losowana jest jedna liczba z przedziału od 1 do 100 i jeśli ta jedna liczba jest równa którejś z tych 10 wcześniej losowanych to przedmiot ulega zniszczeniu , jeśli nie zostaje ulepszony . co ty o tym sądzicie questionmark.gif może w jakiś inny sposób lepiej to zrobić lub zostawić tak jak teraz jest questionmark.gif z góry dziękuje za pomoc smile.gif
bastard13
możesz zrobić też tak:
  1. $zniszczenie=mt_rand(1,10);
  2. $szansa=mt_rand(1,10);
  3. if($zniszczenie==$szansa)
  4. {//zniszczenie
  5. }
  6. else
  7. {//ulepszenie
  8. }

Szansa na ulepszenie wynosi 90%. A sposobów jest pewnie setki:)
Ulysess
wszystko fajnie tylko zapomniałem dodać.. są 4 typy kont której dają takie szanse: 90,84,79,73
bastard13
to wrzuć to wszystko w ifa: if(konto==xx || konto==yy ...)
Noidea
  1. $los = mt_rand( 1, 100 );
  2. $szansa = 90;
  3.  
  4. if( $los <= $szansa )
  5. {
  6. //udało się
  7. }


Co jest złego w takim kodzie, że kombinujesz z dzieleniem przez 100 itp. ?
Ulysess
hmm nie rozumiem , mógłbyś to bardziej rozwinąć questionmark.gif twój wyżej przykład jest dobry bo jest równa liczba.. ale co jeśli są takie jakie podałem , prosił bym o rozwinięcie smile.gif
Noidea
Rozwinięcie:
  1. $szanse = array( 90, 84, 79, 73 );
  2.  
  3. foreach( $szanse as $szansa )
  4. {
  5. $suma = 0;
  6. for( $i = 0; $i < 1000000; $i++ )
  7. {
  8. $los = mt_rand( 1, 100 );
  9.  
  10. if( $los <= $szansa )
  11. {
  12. $suma++;
  13. }
  14. }
  15.  
  16. echo "Mialo byc: " . $szansa . "%, jest: " . round( $suma / 10000, 3 ) . "%<br>";
  17. }



EDIT:
No chyba że chodzi ci o szanse typu: 90.84% czy 79.73%, to wtedy faktycznie i szanse i liczby w mt_rand powinieneś pomnożyć przez 100
Quantum
Cytat
twój wyżej przykład jest dobry bo jest równa liczba.. ale co jeśli są takie jakie podałem

Cytat
90, 84, 79, 73


liczby całkowite, w czym rzecz ? co tu rozwijać ? Noidea podał chyba najprostsze rozwiązanie smile.gif Jeżeli liczba wylosowana liczba z przedziału od 1 do 100 wyniesie =< 90 warunek zwróci true i pierwszy blok instrukcji zostanie wykonany, jeżeli wyniesie > 90 zostanie wykonany blok else. Pod zmienną $szansa podstawiasz procent określony przez konto, switch. Chyba, że ja czegoś tutaj nie zrozumiałem smile.gif

Cytat
  1. mt_srand((double)microtime()*1000000);
  2. $liczba_rand = round(rand(101,10000)/100);


najpierw używasz mt_srand, a później rand? dla rand jest analogicznie srand.
Ulysess
dałem tylko część kodu i zdaje sobie sprawę że dla srand jest rand a mt_srand mt_rand smile.gif co do losowania i dzielenia , 'myślałem' że będzie w taki sposób bardziej losowa liczba. co do wyżej kodu . pętla foreach słuzy w tym wypadku do pobrania wszystkich wartości z tablicy questionmark.gif (przyznam szczerze że nigdy nie używałem dlatego nie wiem :/..) ogólnie rzecz biorąc nie rozumiem w ogóle tego kodu..

hmm ok już rozumiem.. opracowałem podobny kod do opracowania statystyk ale i tak uważam że większe szanse są że zostanie wylosowana liczba powyżej 90 niż miała by trafić się np 1 19 28 ......
Kaffiuri
Cytat(Ulysess @ 1.09.2010, 18:29:18 ) *
ale i tak uważam że większe szanse są że zostanie wylosowana liczba powyżej 90 niż miała by trafić się np 1 19 28 ......


Na szybko napisałem sobie taki kodzik

  1. <?php
  2. $liczba = 0;
  3. $liczba2 = 0;
  4. for ($i=0; $i<100; $i++) {
  5. $los = mt_rand( 1, 100 );
  6. echo $los.'<br />';
  7. if ($los <= 90) {
  8. $liczba++;
  9. }
  10. else {
  11. $liczba2++;
  12. }
  13. }
  14. echo 'Ponizej 90: '.$liczba.'<br />';
  15. echo 'Powyzej 90: '.$liczba2;
  16. ?>


Kilka wynikow:
Cytat
Ponizej 90: 88
Powyzej 90: 12

Cytat
Ponizej 90: 93
Powyzej 90: 7

Cytat
Ponizej 90: 94
Powyzej 90: 6

Cytat
Ponizej 90: 88
Powyzej 90: 12

Cytat
Ponizej 90: 91
Powyzej 90: 9

Cytat
Ponizej 90: 87
Powyzej 90: 13

Cytat
Ponizej 90: 92
Powyzej 90: 8


Prawdopodobieństwo wynosi zawsze koło 90%, wiec mylisz się.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.