2013-07-22 42 views
9

Buduję stronę internetową, która będzie losowo wyświetlać listę skrzatów za każdym razem, gdy strona zostanie odświeżona. Funkcja wyszukiwania małp wyszukuje 20 ofert w tablicy. W tej chwili używam funkcji PHP rand (0,19) do generowania losowej listy za każdym razem, gdy strona jest odświeżana ($ business [rand (0,19)]).Generowanie liczb losowych bez powtórzeń

Czy ktoś może odnieść mnie do mądrzejszej metody randomizacji? Chcę wyświetlić wszystkie 20 ofert, zanim którekolwiek z nich się powtórzy. Jaka jest preferowana metoda rozwiązania tego problemu?

Poniższa odpowiedź nie działa, ponieważ liczby są odtwarzane za każdym razem, gdy odświeżam stronę. Zgaduję, że muszę przechowywać numery, których już używałem?

$numbers = range(0, 19); 

shuffle($numbers); 

// Handle Yelp response data 
$response = json_decode($data); 
$RANDOM = rand(1,19); 
$business = $response->businesses; 

echo "<img border=0 src='".$business[$RANDOM]->image_url."'><br/>"; 
echo $business[$RANDOM]->name."<br/>"; 
echo "<img border=0 src='".$business[$RANDOM]->rating_img_url_large."'><br/>"; 

?> 
+0

Najprostszym sposobem na to jest uprzednie wypełnienie listy odkażonych losowych wartości przed rozdaniem. Dlaczego po prostu nie utworzysz zamówienia z góry i nie wybierzesz ostatniego, który nie był wyświetlany. Dla zwykłych użytkowników będzie to wyglądało losowo. –

+0

jak zachować wszystkie 20 wokół, aby je pokazać? czy przechowujesz aukcje lokalnie, czy api przesyła Ci te same zapytania na życzenie? –

+0

Wyszukaj "Fisher Yates" lub zobacz http://stackoverflow.com/questions/8116872/generate-random-numbers-in-array/8116947#8116947. – paxdiablo

Odpowiedz

30

najprostszym rozwiązaniem:

$numbers = range(1, 20); 
shuffle($numbers); 

Alternatywa:

<?php 

function randomGen($min, $max, $quantity) { 
    $numbers = range($min, $max); 
    shuffle($numbers); 
    return array_slice($numbers, 0, $quantity); 
} 

print_r(randomGen(0,20,20)); //generates 20 unique random numbers 

?> 

Podobne pytanie: #5612656

Codepad: http://codepad.org/cBaGHxFU

Aktualizacja:

Dostajesz wszystkie oferty w tablicy o nazwie $businesses.

  1. Wygeneruj losowy identyfikator aukcji, używając metody podanej powyżej, a następnie zapisz ją w tabeli bazy danych.
  2. Po każdym odświeżeniu strony wygeneruj losowy identyfikator aukcji i sprawdź, czy odpowiada wartości w bazie danych. Jeśli nie, wyświetl tę listę i dodaj tę wartość do swojej tabeli.
  3. Przejdź do kroku 1.

Kiedy to się zakończy, będzie już wyświetlane wszystkie 20 ofert na raz.

Mam nadzieję, że to pomoże!

+1

Przepraszamy, powinienem był podać kod dla lepszego wyjaśnienia. Proszę spojrzeć na moją edycję – ryank

+0

@RyanGoo: Updated. –

Powiązane problemy