Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> arytmetyka liczb dużej precyzji - liczby losowe
kufalo
post 22.08.2007, 16:02:25
Post #1





Grupa: Zarejestrowani
Postów: 251
Pomógł: 2
Dołączył: 24.08.2005

Ostrzeżenie: (0%)
-----


Witam, niestety w bibliotece bc nie ma czegos takiego jak bcrand.
Potrzebuje wylosowac liczbe z przedzialu 0 - x, gdzie x jest to liczba calkowita dodatnia zapisana jako string.
Moze jakies podpowiedzi jak to najwydajniej zrobic w miare krotkim kodem ?
I co wazne aby prawdopodobienstwo otrzymania dowolnej liczby bylo jednakowe dla calej puli liczb.

Ten post edytował kufalo 24.08.2007, 08:40:37
Go to the top of the page
+Quote Post
qqrq
post 23.08.2007, 15:28:30
Post #2





Grupa: Zarejestrowani
Postów: 418
Pomógł: 8
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


Sprawa jest w sumie dość kłopotliwa - leżeli powiedzmy wiesz ile cyfr (powiedzmy xxxx) ma mieć dana liczba - to przechodzisz pętelką po wszystkich "miejscach cyfr" liczby (po iksach) i dla każdego losujesz cyferkę od 0 do 9. Ilość cyfr dziesiętnych też można losować, ale za słaby z rachunku prawdopodobieństwa jestem, żeby powiedzieć, czy liczba losowana w ten sposób (najpierw losujemy ilość cyfr, potem cyfry po kolei) jest tak samo "losowa" jak ta generowana powiedzmy funkcją mt_rand()...

Ten post edytował qqrq 23.08.2007, 15:29:52


--------------------
Go to the top of the page
+Quote Post
kufalo
post 24.08.2007, 08:43:45
Post #3





Grupa: Zarejestrowani
Postów: 251
Pomógł: 2
Dołączył: 24.08.2005

Ostrzeżenie: (0%)
-----


No wlasnie ten sposob jest dobry, ale tylko dla liczb x typu 9, 99, 99, 999

Jezeli przykladowo chce lowocac liczbe z przedzialu 0 - 800 to moge wylosowac Twoim sposobem liczbe z przedzialu 0 - 999, a potem reszte z przelenia (bcmod) przez gorna granice plus jeden.
Niby dziala dobrze, ale prawdopodobienstwa wystapiania liczb nie sa jednakowe, poniewa np 0 osiagamy dla wylosowanego 0 oraz 801.
Go to the top of the page
+Quote Post
qqrq
post 25.08.2007, 19:31:55
Post #4





Grupa: Zarejestrowani
Postów: 418
Pomógł: 8
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


No to wymóżdżyłem coś takiego:

  1. <?php
  2. function BCRand($max)
  3. {
  4.  if (!ctype_digit($max))  // tak jakby ktoś chciał losować nie po liczbie...
  5. return false;
  6.  if ($max<1) // sie rozumie...
  7. return false;
  8.  
  9.  $rand = '';
  10.  $is_max = true; // zmienna sprawdza, czy wszystkie wylosowane dotąd cyferki należą do górnego ogra
    niczenia
  11.  $length = strlen($max);
  12.  
  13.  for ($k=0;$k<$length;$k++)
  14.  {
  15. $rand .= (string)rand(0,($is_max)?$max[$k]:9);
  16. if ($rand[$k] != $max[$k])
  17.  $is_max = false;
  18.  }
  19.  return $rand
  20. }
  21. ?>


Od razu mówię - to tak z głowy, nieprzetestowane, ale zasadę działania tego wszystkiego chyba widać.

Pozdrawiam!


--------------------
Go to the top of the page
+Quote Post
zimi
post 26.08.2007, 11:35:50
Post #5





Grupa: Zarejestrowani
Postów: 233
Pomógł: 9
Dołączył: 3.06.2007

Ostrzeżenie: (0%)
-----


trochę kiepsko w skrypcie @qqrq z prawdopodobieństwem
trochę lepiej będzie chyba z takim kodem:
  1. <?php
  2. function bcrand($zakres)
  3. {
  4. $wykladnik = 5;
  5. $liczb = strlen($zakres);
  6. $isMax = TRUE;
  7. for($i = 0; $i < $liczb; $i++)
  8. {
  9. if($isMax)
  10. {
  11. $do = (int)substr($zakres, $i, $wykladnik);
  12. $liczba = (string)rand(0, $do);
  13. if(strlen($liczba)==strlen($do))
  14. {
  15. $liczba = $liczba{0};
  16. }
  17. else
  18. {
  19. $liczba = '0';
  20. }
  21. $do=(string)$do;
  22. $isMax = ($liczba==$do{0});
  23. $wydruk .= $liczba;
  24. }
  25. else
  26. {
  27. $wydruk .= rand(0, 9);
  28. }
  29. }
  30. $tnij=0;
  31. while($wydruk{$tnij}=='0') $tnij++;
  32. $wydruk = substr($wydruk, $tnij);
  33. return $wydruk;
  34. }
  35. ?>

ew. zabezpieczenia trzeba sobie dopisać...
Go to the top of the page
+Quote Post
UDAT
post 26.08.2007, 12:04:05
Post #6





Grupa: Zarejestrowani
Postów: 442
Pomógł: 0
Dołączył: 27.12.2005

Ostrzeżenie: (0%)
-----


gmp_random" title="Zobacz w manualu PHP" target="_manual
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.07.2025 - 09:49