Задать вопрос
@Jony1337

Есть ли вероятность повтора одой цифры в данном коде?

Появилась задача получить 4 рандомных числа и что бы не повторялись , нашел кучу рабочих примеров в интернете но решил сделать и свой
for ($i=0; $i <= 3 ; $i++ ) {
	$randNumber[$i] = rand (1,100);
	if ($randNumber[$i] == $randNumber[$i+1]) {
		$randNumber [$i+1] = rand (1,100);
	}
	echo $randNumber [$i];
	echo "<br>";
}

вроде раз 20 проверял , не повторяются , есть ли вероятность что они хотя бы раз повторятся ?
  • Вопрос задан
  • 380 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 2
Конечно, вероятность есть. Как уже писали, нельзя сравнивать со следующим пустым значением.
Думаю, лучше сделать так:
// Необходимое количество случайных чисел
$limit = 4;
// Максимальное значение случайного числа
$max = 100;
// Массив, в который складываются случайные числа
$numbers = [];

// Запускаем цикл
while(1) {
	// Генерируем случайное число
	$random = rand(1, $max);
	
	// Проверяем, есть ли уже такое число в массиве-результате
	if(!in_array($random, $numbers)) {
		// Если такого числа нет, добавляем его в массив
		$numbers[] = $random;
	}
	
	// Если уже набрали нужное количество чисел - выходим из цикла
	if(count($numbers) == $limit) { 
		break; 
	}
}

var_dump($numbers);
Ответ написан
xpert13
@xpert13
Full Stack Developer
Простой вариант, который гарантировано не повторит выбранные значения (без каких либо проверок и выложенных циклов):
// Генерируем массив вариантов чисел для выбора (от 1 до 100)
$numbers = range(1, 100);

// Перемешиваем этот массив
shuffle($numbers);

// Выбираем первые 3 эллемента
$output = array_slice($numbers, 0, 3);

// Выводим результат
print_r($output);


P.S. Данный алгоритм оправдано использовать только на небольших диапазонах чисел (как к примеру от 1 до 100).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@edb
SQL
есть. Но по сути у вас и не проверяется на уникальность.
что делает проверка if ($randNumber[$i] == $randNumber[$i+1]) { ??? сравнивает с пустым значением? Чтобы обеспечить уникальность, вам необходимо сделать двойной цикл: основной для генерации и внутренний для проверки уникальности.
Ответ написан
Комментировать
@ukoHka
Всего понемногу
for ($i=0; $i <= 3 ; $i++ ) { //$i=0;
  $randNumber[$i] = rand (1,100); //Допустим 50
  if ($randNumber[$i] == $randNumber[$i+1]) { //$randNumber[$i+1] == null для i=0
    $randNumber [$i+1] = rand (1,100); //Допустим 50
  }
  echo $randNumber [$i]; //50
  echo "<br>"; //<br>
}

Пока что, если предположить, что в массиве изначально все значения null, условие никогда не выполнится.
Надо бы с предыдущим сравнивать, а не со следующим.
Ответ написан
Комментировать
webinar
@webinar Куратор тега PHP
Учим yii: https://youtu.be/-WRMlGHLgRg
Есть. Как минимум Ваша проверка не будет работать вообще:
if ($randNumber[$i] == $randNumber[$i+1]) {
???? У Вас же нет $randNumber[$i+1]. Вы создали $randNumber[$i] и проверяете с еще не существующим $randNumber[$i+1].
Допустим это описка и имелось в виду $randNumber[$i-1], а как же с пред пред идущим элементом быть?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы