Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Losowanie niepowtarzalnych liczb
Yeti6
post 20.06.2009, 17:07:29
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 8.02.2009
Skąd: Wola Filipowska

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


Witam!

W jaki sposób wygenerować zestaw liczb z przedziału np. 1 do 500 tak aby nie powtarzały się? Używam do tego pętli i funkcji rand(), ale niestety liczby dość często się powtarzają. 
Go to the top of the page
+Quote Post
piotrooo89
post 20.06.2009, 17:09:04
Post #2


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




mt_rand


--------------------
Go to the top of the page
+Quote Post
erix
post 20.06.2009, 17:10:16
Post #3





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Wciskasz do tablicy te liczby i sprawdzasz przez in_array" title="Zobacz w manualu PHP" target="_manual, czy już jest.

Albo poszukaj implementacji wariacji bez powtórzeń.


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

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Wicepsik
post 20.06.2009, 17:11:50
Post #4





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

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


http://www.google.pl/search?hl=pl&clie...php&spell=1

Ten post edytował Wicepsik 20.06.2009, 17:12:38


--------------------
Go to the top of the page
+Quote Post
seth-kk
post 20.06.2009, 17:21:31
Post #5





Grupa: Zarejestrowani
Postów: 444
Pomógł: 79
Dołączył: 26.05.2009

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


Cytat(erix @ 20.06.2009, 18:10:16 ) *
Wciskasz do tablicy te liczby i sprawdzasz przez in_array" title="Zobacz w manualu PHP" target="_manual, czy już jest.

Albo poszukaj implementacji wariacji bez powtórzeń.

lepiej najpierw wypelnic tablice liczbami i losowac element i wycinac go (kolejne losowania maja miejsce na pozostalych)


--------------------
Go to the top of the page
+Quote Post
Spawnm
post 20.06.2009, 17:43:38
Post #6





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




a może zrobić tablicę , potem shuffle" title="Zobacz w manualu PHP" target="_manual i wyświetlić pierwsze x znaków
ew. array_rand" title="Zobacz w manualu PHP" target="_manual tylko nie pamiętam czy wyniki mogą się powtarzać ...
Go to the top of the page
+Quote Post
Fixus
post 20.06.2009, 18:07:32
Post #7





Grupa: Zarejestrowani
Postów: 295
Pomógł: 9
Dołączył: 8.02.2006

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


Cytat(seth-kk @ 20.06.2009, 16:21:31 ) *
lepiej najpierw wypelnic tablice liczbami i losowac element i wycinac go (kolejne losowania maja miejsce na pozostalych)


ale tu dochodzi problem tego, że jak wytniesz coś ze środka musisz wszystko przesunąć a to strata czasu i zasobów.

Prostym rozwiązaniem jest wylosowanie liczby, i wrzucenie do $tablica[$i]
następnie wylosowanie i sprawdzenie z $tablica za pomocą in_array(). jeśli się powtarza losować dalej, jak się nie powtarza wrzucić do tablicy $tablica[$i+1]
Go to the top of the page
+Quote Post
athei
post 20.06.2009, 18:17:22
Post #8





Grupa: Zarejestrowani
Postów: 389
Pomógł: 141
Dołączył: 11.04.2009

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


Kod
$los = range(1, 500); //zakres
shuffle($los); //miesza

$liczby = array_slice($los, 0, 30); // Ilość liczb do wyświetlenia
print_r($liczby);
Go to the top of the page
+Quote Post
Wicepsik
post 20.06.2009, 18:18:09
Post #9





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

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


Cytat(piotrooo89 @ 20.06.2009, 18:09:04 ) *

Niestety, twój sposób nie działa smile.gif

  1. <?php
  2. for($i=0;$i<10;$i++){
  3.    echo mt_rand(1, 10).'<br>';
  4. }
  5. ?>

Kod
1
8
8
7
6
3
4
2
10
9




kodzik
  1. <?php
  2. $tab = range($min, $max);
  3. $wylosowane = array_rand($tab, $ilosc);
  4. ?>


--------------------
Go to the top of the page
+Quote Post
Spawnm
post 20.06.2009, 18:35:45
Post #10





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




mt_rand to takie lepsze rand, rzadziej się liczby powtarzają zaraz po sobie czyli 11233.

Wicepsik, z tym array_rand sprawdzałeś , jednak się nie powtarzają ? smile.gif
Go to the top of the page
+Quote Post
Wicepsik
post 20.06.2009, 19:03:46
Post #11





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

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


Cytat(Spawnm @ 20.06.2009, 19:35:45 ) *
mt_rand to takie lepsze rand, rzadziej się liczby powtarzają zaraz po sobie czyli 11233.

Wicepsik, z tym array_rand sprawdzałeś , jednak się nie powtarzają ? smile.gif

Zawsze testuje kody które podaję na forum winksmiley.jpg


--------------------
Go to the top of the page
+Quote Post
Szunaj85
post 20.06.2009, 21:46:40
Post #12





Grupa: Zarejestrowani
Postów: 392
Pomógł: 7
Dołączył: 11.05.2008

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


Może ten skrypt ci podpasuje. snitch.gif
  1. <?php
  2.  $liczby = range(1,500); //zakres liczb do wylosowania
  3.  $klucze = array_rand($liczby, 5); //ilość liczb do wylosowania
  4.  foreach($klucze as $klucz)
  5.  {
  6.    echo $liczby[$klucz]; //wyświetla wynik    
  7.  }
  8.  ?>


Ten post edytował Szunaj85 20.06.2009, 21:47:09


--------------------
Jeśli Ci pomogłem wciśnij Jeśli mi pomożesz wcisnę
Go to the top of the page
+Quote Post
erix
post 20.06.2009, 21:48:23
Post #13





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




~Szunaj85, gdybyś zerknął nieco wcześniej, zobaczyłbyś że ten kod już jest...

Nie przesadzajmy, już jest tyle rozwiązań, wystarczy...


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

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Yeti6
post 21.06.2009, 09:37:14
Post #14





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 8.02.2009
Skąd: Wola Filipowska

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


Dziękuję wszystkim za pomoc, array_rand jednak dał radę smile.gif  

Pozdrawiam!
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: 27.04.2025 - 08:33