Создайте 9-значный номер не более 3-х дубликатов - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь создать скретч-карту, подобную системе в php, которая отображает победителя или проигравшего на основе случайных генерируемых чисел.

Я знаю, что могу создать случайное число, используя mt_rand или rand в диапазоне от 0 до9, но проблема, которую я имею, состоит в том, чтобы убедиться, что не более одного дубликата 3

9-значное число вышло с 100% без совпадающих цифр или 9-значное число с одним числом, появляющимся максимум 3 разавот так 2948410427

причина, по которой я делаю это таким образом, в том, что у меня много тематических карточек, каждая тема имеет 10 маленьких значков. Эти значки нумеруются 0-9. Веб-пользователь открывает мое приложение. Он случайным образом выбирает темуи затем отправьте запрос на мой сервер с этой темой

, затем сервер сгенерирует числа, а затем эти числа будут выведены в формате json, так что

{
    "Theme": "Space",
    "one": 3,
    "two": 6,
    "three": 0,
    "four": 7,
    "five": 1,
    "six": 3,
    "seven": 2,
    "eight": 9,
    "nine": 3,
    "winner": true
}

мое приложение будет использовать этичисла для ссылки на изображения

1.png
2.png
3.png

и т. д., заполняя поцарапанную сетку.

это лучший способ, которым я могу придуматьсделайте это, также учитывая случайный выбор темы и случайных победителей.

если кто-то еще может придумать лучший способ, я был бы рад услышать это.

Ответы [ 3 ]

1 голос
/ 29 марта 2019

После ответа @AbraCadaver, как насчет (извините, мой PHP очень ржавый)

$src  = array_merge($r=range(1, 9), $r, $r); /* 123456789123456789123456789 */
$keys = array('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine');

shuffle($src);
$result = array_slice($src, 0, 9);

$result = array_combine($keys, $result);

все комбинации будут разрешены и равномерно распределены с максимум 3 повторяющимися числами

ОБНОВЛЕНИЕ

Только что попробовал на http://phptester.net версии, где начальный массив немного отличается, а результат (после нажатия кнопки теста в течение 50 или более раз) виден немного иначе.Любопытно, если качество реализации shuffle () хорошее ...

$src = array_merge(range(1, 9), range(9, 1, -1), range(1, 9)); /* 123456789987654321123456789 */
print_r($src);
shuffle($src);
$result = array_slice($src, 0, 9);
print_r($result);
1 голос
/ 29 марта 2019

Если вы перемешаете и нарежете 3 раза, нарезая 3 значения, вы получите 9 значений и только когда-либо получите максимум 3 из любого значения:

$array = range(1, 9);
$keys  = array('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine');

shuffle($array);
$result = array_slice($array, 0, 3);
shuffle($array);
$result = array_merge($result, array_slice($array, 0, 3));
shuffle($array);
$result = array_merge($result, array_slice($array, 0, 3));

$result = array_combine($keys, $result);

Мне нравится Ответ Северина Паппадо со следующими изменениями:

$array = array_merge($r = range(1, 9), $r, $r);
$keys  = array('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine');
shuffle($array);
$result = array_combine($keys, array_slice($array, 0, 9));

Чтобы проверить наличие 3 одинаковых значений, посчитайте значения и найдите 3:

if($v = array_search(3, array_count_values($result))) {
    echo "You won with $v"; // :-)
} else {
    echo "Loser";           // :-(
}
0 голосов
/ 29 марта 2019

Создание базы с диапазоном 2 x [0-9].
Добавьте одно случайное число, затем перемешайте их все.

Вырежьте первые девять цифр из массива и соедините их, чтобы создать скретч-карту.

Это означает, что случайным является случай, если скретч-карта является выигрышной, и случайным является число, равное трем.

$base = array_merge(range(0,9), range(0,9));
$winning_number = [mt_rand(0,9)];

$all_numbers = array_merge($base, $winning_number);
shuffle($all_numbers);

$scratch_card = array_slice($all_numbers, 0,9);

echo join($scratch_card);

https://3v4l.org/NjItR

...