Search code examples
phpalgorithmrandom

Generating random numbers without repeats


I'm building a website that will randomly display a yelp listing each time the page is refreshed. The yelp search api returns 20 listings in an array. Right now, I am using PHP's function rand(0,19) to generate a random listing every time the page is refreshed ( $businesses[rand(0,19)] ).

Can someone refer me to a smarter method to randomize? I want to show all 20 listings once before any of them are repeated. What is the preferred method to handle this problem?

the below answer doesn't work because the numbers are recreated every time I refresh the page. I'm guessing I need to store which numbers I've used already?

$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/>";

?>

Solution

  • Easiest solution:

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

    Alternative:

    <?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
    
    ?>
    

    Similar question: #5612656

    Codepad: http://codepad.org/cBaGHxFU

    Update:

    You're getting all the listings in an array called $businesses.

    1. Generate a random listing ID using the method given above, and then store it your database table.
    2. On each page refresh, generate a random listing ID, and check if it matches the value in your database. If not, display that listing and add that value to your table.
    3. Go to step 1.

    When this is completed, you will have displayed all the 20 listings at once.

    Hope this helps!