Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Funkcja losująca, losowanie wielokrotne
jam09
post 22.01.2011, 19:49:08
Post #1





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 19.01.2010

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


Hej
Proszę o pomoc, chciałbym wylosować 10 liczb ze 100. Mógłbym użyć funkcji rand(), ale czasami zdarzają się powtórzenia liczb np. 10 i 10. Jak mógłbym uniknąć powtórzeń ? Z góry dzięki za pomoc.

Ten post edytował jam09 22.01.2011, 19:50:09
Go to the top of the page
+Quote Post
Daiquiri
post 22.01.2011, 19:52:02
Post #2





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




Jeżeli chcesz korzystać z rand() to postaw warunek if(wylosowana liczba == poprzednia liczba) losuj jeszcze raz.
Go to the top of the page
+Quote Post
toaspzoo
post 22.01.2011, 19:52:09
Post #3





Grupa: Zarejestrowani
Postów: 778
Pomógł: 84
Dołączył: 29.07.2010
Skąd: Gliwice / Pławniowice Mistrz niezmordowanej klawiatury.

Ostrzeżenie: (20%)
X----


jeżeli chodzi o niepowtarzający się, to użyj md5(microtime)


--------------------

LS Easter egg <
Go to the top of the page
+Quote Post
jam09
post 22.01.2011, 20:09:28
Post #4





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 19.01.2010

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


Jeśli jest inna metoda niż rand() to z chęcią bym skorzystał.
Daiquiri
Jak sobie wyobrażasz 10 liczb porównywać ? Każdą liczbę trzeba sprawdzić przez 9 liczb. To będzie 90 if. Jak dla mnie straszne opóźnienie. Zresztą skąd mam mieć pewność że nie wylosuje znowu liczby, która była już wylosowana ? Można by było puścić to jeszcze raz, a potem jeszcze raz, aż do skutku ale ile zajmie to czasu ? Nie ma czegoś czym by było lepiej i szybciej ?
Go to the top of the page
+Quote Post
Crozin
post 22.01.2011, 20:18:15
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Jaka jest maksymalna pula? Jeżeli jest to 100, 1 000 czy 10 000 możesz najpierw wygenerować sobie te wszystkie elementy po czym z nich wylosować 10:
  1. $range = range(1, 10000);
  2. $items = array_rand($range, 10);
Możesz też po prostu losować liczbę i sprawdzać czy takowa nie została już wylosowana:
  1. $items = array();
  2.  
  3. do {
  4. $rand = mt_rand(0, 10000);
  5. if (!in_array($rand, $items)) {
  6. $items[] = $rand;
  7. }
  8. } while (count($items) < 10);
Sposobów jest cała masa...
Go to the top of the page
+Quote Post
Daiquiri
post 22.01.2011, 20:19:35
Post #6





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




No co Ty - porównujesz 10 zmiennych nie 90 smile.gif. Sposobów jest multum, możesz np. wykorzystać tablice.
Go to the top of the page
+Quote Post
phpion
post 24.01.2011, 08:12:43
Post #7





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




@Crozin:
Mam lekkiego bzika na punkcie Nesquika i optymalizacji wydajności kodów, więc pozwolę sobie nieco zmodyfikować Twój kod. Lepiej zamiast in_array() skorzystać z isset() i nieco zmienić sposób przechowywania wylosowanych liczb.
  1. $items = array();
  2.  
  3. do {
  4. $rand = mt_rand(0, 10000);
  5. //if (!in_array($rand, $items)) {
  6. if (!isset($items[$rand])) {
  7. //$items[] = $rand;
  8. $items[$rand] = TRUE;
  9. }
  10. } while (count($items) < 10);

Wypadałoby jeszcze pozbyć się tego count'a na rzecz zwykłego licznika, ale to już pozostawiam autorowi wątku w ramach treningu smile.gif
Go to the top of the page
+Quote Post
Crozin
post 24.01.2011, 14:19:49
Post #8





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Wiem, że ideone.com to nie najlepsza platforma do testów, ale... http://ideone.com/hN2J6 Oczywiście masz rację - odpowiednio dostosowane Twoje rozwiązanie jest bezsprzecznie szybsze. Ale na dobrą sprawę zyskujemy te 0,000004 sekundy (w przypadku normalnej platformy wyszłoby pewnie jeszcze mniej) kosztem gorszego kodu (bo jest mniej oczywisty itd.).

Czy warto? W normalnym przypadku nie.
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: 31.07.2025 - 07:50