Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Losowanie sredniej liczby
Forum PHP.pl > Forum > Przedszkole
miki92
Witam moglby mi ktos pomoc w zrobieniu skryptu ktory mialby ustawiona srednia liczbe i ma losowac np od 1-10 i srednia losowan ma wynosic 2 czy mozna taki skrypt zrobic jesli tak to jak jakos nie mam pomyslu smile.gif
Pozdrawiam.
Pride
Szczerze? tongue.gif To nie rozumiem co chcesz wykonać.
Ma to być:
1. Skrypt ma się wykonać 2razy?
2. Skrypt ma się wykonać około 2razy (np +/- 1)?
3. Skrypt ma wylosować srednią między 1-10? tongue.gif
miki92
ma losowac liczbe od 1-10 ale srednia liczba ktora wybierze ma byc 2 wiec np wybierze 1,5,2,1,1 smile.gif
ikssde
Zeby sobie wylosowac liczbe wystarczy uzyc funkcji rand() - jej pierwszy argument okresla poczatek zakresu, a drugi argument koniec. Tak wiec jesli chcesz wylosowac liczbe z zakresu od 1 do 10 musisz ja wywolac : rand(1, 10);

Tylko w dalszym ciagu nie moge zrozumiec co ty chcesz zrobic... jak to srednia liczba ktora wybierze? Sprobuj pokazac nam to na jakims przykladzie czy bardziej logicznie to przedstaw, bo chyba nie ja jeden nie wiem o co chodzi.
Piniek
Z tego co ja wywnioskowałem on chce wylosować przypuśćmy 5liczb których średnia będzie wynosiła np 2. Według mnie musisz po prostu losować kolejno liczb z przedziału 1-10 za pomocą pętli i sprawdzać czy średnia wylosowanych liczb jest równa 2. Raczej nie jest to optymalny sposób ale taki mi przyszedł do głowy winksmiley.jpg

Pozdrawiam
ikssde
Wiesz ze nawet probowalem tak zrobic winksmiley.jpg Tylko troche jest to nie wykonalne. Skrypt wykonuje sie baaaaardzo dlugo, a tak poważnie to nawet nie doczekalem sie jego zakończenia sad.gif Mysle ze nie do konca o to mu chodzi. Jak odpisze to moze cos pomozemy smile.gif
Piniek
długość wykonania tego skryptu jest rożna dla każdego przypadku w zależności od wylosowanych liczb być może za pierwszym wykonaniem pętli ich średnia będzie wynosić 2 lecz równie dobrze może to nastąpić po 100 wykonaniach pętli dlatego mówiłem ze ten sposób nie jest optymalny.


EdIt:
: Pytanie do autora tematu w jakim celu ci to potrzebne może da się to załatwić w inny sposób.
ikssde
Równie dobrze moze nie nastapic nigdy smile.gif Zreszta nie widze potrzeby stosowania czegos takiego... no ale przeciez lubimy sobie utrudniac zycie ;p
Black-Berry
heh. taki skrypt nie wykona się nigdy bo kolejne losowania będą dążyły do 5 a nie 2. Żeby napisac taki skrypt należy losować małą ilośc liczb np <10 i powtażać losowanie za każdym razem gdy skrypt przekroczy 10 losowań. (pętla w pętli).
elemek
  1. <?php
  2. /**
  3.  * Klasa do oszukanego ;) losowania :)
  4.  * @author ElemeK
  5.  */
  6. class CheatRand {
  7. protected $n = 0;
  8. protected $sum = 0;
  9. protected $srednia;
  10. protected $min;
  11. protected $max;
  12. protected $p;
  13.  
  14. /**
  15.  * Tworzymy nowy obiekt losujący.
  16.  *
  17.  * @param int $min dolny przedział zakresu losowania
  18.  * @param int $max górny przedział zakresu losowania
  19.  * @param int $srednia wartość oczekiwana :)
  20.  */
  21. public function __construct($min, $max, $srednia) {
  22. $this -> srednia = $srednia;
  23. $this -> min = $min;
  24. $this -> max = $max;
  25.  
  26. $range = $max - $min;
  27. $sp = $srednia - $min;
  28. if ($srednia > $range/2) {
  29. $this -> p = 1 - 1 / ($range / ($range - $srednia));
  30. } else {
  31. $this -> p = 1 / ($range / $srednia);
  32. }
  33. }
  34.  
  35. /**
  36.  * Losowanie wartości z przedziału zadanego przy tworzeniu obiektu.
  37.  *
  38.  * @return int losowa wartość z zadanego przedziału.
  39.  */
  40. public function rand() {
  41. $this -> n++;
  42. if (rand(0,1024)/1024 > $this -> p) {
  43. $x = rand($this -> min, $this -> srednia);
  44. } else {
  45. $x = rand($this -> srednia, $this -> max);
  46. }
  47. $this -> sum += $x;
  48. return $x;
  49. }
  50.  
  51. /**
  52.  * Aktualna wartość średnia od początku losowań.
  53.  *
  54.  * @return float
  55.  */
  56. public function avg() {
  57. return $this -> sum / $this -> n;
  58. }
  59. }
  60.  
  61. /* Przykład zastosowania */
  62.  
  63. /* Nowy obiekt oszukanego losowania :) */
  64. $rnd = new CheatRand($od = 1, $do = 10, $srednia = 2);
  65.  
  66. /* drukuj sto wartości losowych. */
  67. for ($i = 0; $i < 100; $i++) {
  68. echo "{$rnd -> rand()}\n"; 
  69. }
  70.  
  71. /* sprawdź wartość średnią */
  72. echo "srednia: {$rnd -> avg()}\n"; 
  73. ?>
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.