Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP rand() exclude certain numbers

Tags:

php

I have this:

<?php  $n = rand(1,1600); echo $n ?>

I want to exclude from random numbers let's say 234, 1578 ,763 , 1274 and other numbers. How would I do that?

like image 877
Portaltv Romania Avatar asked Jun 14 '13 13:06

Portaltv Romania


People also ask

How do you set a range in rand function?

By default, rand returns normalized values (between 0 and 1) that are drawn from a uniform distribution. To change the range of the distribution to a new range, (a, b), multiply each value by the width of the new range, (b – a) and then shift every value by a.

How can I generate 5 random numbers in PHP?

rand() or mt_rand() functions can be used to Generate 5 Digit Random Number in PHP.

What is the use of rand () in PHP?

The rand() function generates a random integer. Example tip: If you want a random integer between 10 and 100 (inclusive), use rand (10,100). Tip: As of PHP 7.1, the rand() function has been an alias of the mt_rand() function.

Does rand () give 0?

RAND returns an evenly distributed random real number greater than or equal to 0 and less than 1. A new random real number is returned every time the worksheet is calculated.


1 Answers

As the volume of "blacklisted" integers approaches the volume of the full range of integers, it becomes increasingly compelling to take the advice of @regenschein.

A non-iterative approach might look like this:

$range = range(1, 1600);
$blacklist = [234, 1578, 763, 1274]; // 4 blacklisted versus 1600 full range is NOT compelling
$valids = array_diff($range, $blacklist);
echo array_values($valids)[rand(0, count($valids) - 1)];
// or
echo $valids[array_rand($valids)];
// the two approaches use different randomizers

Or if you'd be just as happy shuffling, you could do:

$blacklist = [234, 1578, 763, 1274];
$range = range(1, 1600);
$valids = array_diff($range, $blacklist);
shuffle($valids);
echo $valids[0];

*Note array_diff() is particularly great if you want to pass multiple blacklist arrays -- just comma-separate them.

For example:

var_export($valids = array_diff(range(1, 100), range(5, 50), range(61, 99), [55]));

Output:

array (
  0 => 1,
  1 => 2,
  2 => 3,
  3 => 4,
  50 => 51,
  51 => 52,
  52 => 53,
  53 => 54,
  55 => 56,
  56 => 57,
  57 => 58,
  58 => 59,
  59 => 60,
  99 => 100,
)
like image 158
mickmackusa Avatar answered Oct 15 '22 14:10

mickmackusa