Кластеризация запросов

Зачем нужны функции getstate() и setstate() ?

Если вы получили предыдущее состояние и восстановили его, тогда вы сможете оперировать одними и теми же случайными данными раз за разом. Помните, что использовать другую функцию random в данном случае нельзя. Также нельзя изменить значения заданных параметров. Сделав это, вы измените значение состояния .

Для закрепления понимания принципов работы и в генераторе случайных данных Python рассмотрим следующий пример:

Python

import random

number_list =

print(«Первая выборка «, random.sample(number_list,k=5))

# хранит текущее состояние в объекте state
state = random.getstate()

print(«Вторая выборка «, random.sample(number_list,k=5))

# Восстанавливает состояние state, используя setstate
random.setstate(state)

#Теперь будет выведен тот же список второй выборки
print(«Третья выборка «, random.sample(number_list,k=5))

# Восстанавливает текущее состояние state
random.setstate(state)

# Вновь будет выведен тот же список второй выборки
print(«Четвертая выборка «, random.sample(number_list,k=5))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

importrandom

number_list=3,6,9,12,15,18,21,24,27,30

print(«Первая выборка «,random.sample(number_list,k=5))

 
# хранит текущее состояние в объекте state

state=random.getstate()

print(«Вторая выборка «,random.sample(number_list,k=5))

 
# Восстанавливает состояние state, используя setstate

random.setstate(state)

 
#Теперь будет выведен тот же список второй выборки

print(«Третья выборка «,random.sample(number_list,k=5))

 
# Восстанавливает текущее состояние state

random.setstate(state)

 
# Вновь будет выведен тот же список второй выборки

print(«Четвертая выборка «,random.sample(number_list,k=5))

Вывод:

Shell

Первая выборка
Вторая выборка
Третья выборка
Четвертая выборка

1
2
3
4

Перваявыборка18,15,30,9,6

Втораявыборка27,15,12,9,6

Третьявыборка27,15,12,9,6

Четвертаявыборка27,15,12,9,6

Как можно заметить в результате вывода — мы получили одинаковые наборы данных. Это произошло из-за сброса генератора случайных данных.

Генерация случайных универсально уникальных ID

Модуль Python UUID предоставляет неизменяемые UUID объекты. UUID является универсально уникальным идентификатором.

У модуля есть функции для генерации всех версий UUID. Используя функцию , можно получить случайно сгенерированное уникальное ID длиной в 128 битов, которое к тому же является криптографически надежным.

Полученные уникальные ID используются для идентификации документов, пользователей, ресурсов и любой другой информации на компьютерных системах.

Пример использования в Python:

Python

import uuid

# получить уникальный UUID
safeId = uuid.uuid4()
print(«безопасный уникальный id «, safeId)

1
2
3
4
5
6

importuuid

 
 
# получить уникальный UUID

safeId=uuid.uuid4()

print(«безопасный уникальный id «,safeId)

Вывод:

Shell

безопасный уникальный id fb62463a-cd93-4f54-91ab-72a2e2697aff

1 безопасныйуникальныйidfb62463a-cd93-4f54-91ab-72a2e2697aff

Генератор случайных чисел нормального распределения

Функции СЛЧИС и СЛУЧМЕЖДУ выдают случайные числа с единым распределением. Любое значение с одинаковой долей вероятности может попасть в нижнюю границу запрашиваемого диапазона и в верхнюю. Получается огромный разброс от целевого значения.

Нормальное распределение подразумевает близкое положение большей части сгенерированных чисел к целевому. Подкорректируем формулу СЛУЧМЕЖДУ и создадим массив данных с нормальным распределением.

Себестоимость товара Х – 100 рублей. Вся произведенная партия подчиняется нормальному распределению. Случайная переменная тоже подчиняется нормальному распределению вероятностей.

При таких условиях среднее значение диапазона – 100 рублей. Сгенерируем массив и построим график с нормальным распределением при стандартном отклонении 1,5 рубля.

Используем функцию: =НОРМОБР(СЛЧИС();100;1,5).

Программа Excel посчитала, какие значения находятся в диапазоне вероятностей. Так как вероятность производства товара с себестоимостью 100 рублей максимальная, формула показывает значения близкие к 100 чаще, чем остальные.

Перейдем к построению графика. Сначала нужно составить таблицу с категориями. Для этого разобьем массив на периоды:

  1. Определим минимальное и максимальное значение в диапазоне с помощью функций МИН и МАКС.
  2. Укажем величину каждого периода либо шаг. В нашем примере – 1.
  3. Количество категорий – 10.
  4. Нижняя граница таблицы с категориями – округленное вниз ближайшее кратное число. В ячейку Н1 вводим формулу =ОКРВНИЗ(E1;E5).
  5. В ячейке Н2 и последующих формула будет выглядеть следующим образом: =ЕСЛИ(G2;H1+$E$5;»»). То есть каждое последующее значение будет увеличено на величину шага.
  6. Посчитаем количество переменных в заданном промежутке. Используем функцию ЧАСТОТА. Формула будет выглядеть так:

На основе полученных данных сможем сформировать диаграмму с нормальным распределением. Ось значений – число переменных в промежутке, ось категорий – периоды.

График с нормальным распределением готов. Как и должно быть, по форме он напоминает колокол.

Сделать то же самое можно гораздо проще. С помощью пакета «Анализ данных». Выбираем «Генерацию случайных чисел».

О том как подключить стандартную настройку «Анализ данных» читайте .

Заполняем параметры для генерации. Распределение – «нормальное».

Жмем ОК. Получаем набор случайных чисел. Снова вызываем инструмент «Анализ данных». Выбираем «Гистограмма». Настраиваем параметры. Обязательно ставим галочку «Вывод графика».

Получаем результат:

График с нормальным распределением в Excel построен.

Вещички

  • Безделушки
    При создании персонажа вы можете совершить бросок по этой таблице, чтобы получить безделушку — небольшой предмет, немного окутанный тайной. Мастер тоже может использовать эту таблицу. Она поможет заполнить комнаты подземелий и карманы существ.

  • Что в карманцах?
    Партийный вор опять решил проверить карманы прохожих? Что же он там найдет? Вот d100 вариантов мелочей, которые могут оказатья при себе у разных обывателей.

  • Обычная мебель и предметы
    Список из d100 обычных предметов, которые могут находиться в любом доме.

  • Утварь и личные предметы
    Вполне обычные вещи, что найдутся в каждом доме.

  • Религиозные предметы и мебель
    Список из d100 вещей, для святилища или подобного религиозного помещения.

  • Принадлежности магов
    Что можно найти в рабочем кабинете мага? Например, эти d100 предметов.

  • Содержимое контейнера
    Приключенцы нашли очередную таинственную шкатулку или загадочный сосуд? Вот d100 довольно обычных вещей, что там можно найти.

  • Книги и свитки
    В городской библиотеке или в лаборатории мага обязательно наайдется что почитать. Ну или хотя бы посмотреть картинки

  • Альтернативный список Безделушек для D&D5
    Если сотня безделушек из книги игрока D&D5 уже приелась, вот еще d100 вещиц.

  • 100 предметов искусства, исторических артефактов и разного лута
    Еще одна сотня вещичек, которые можно найти в приключениях. На этот раз это предметы искусства.

  • 100 бесполезных, но занятных безделушек
    Порой, партия не находит ничего полезного, но это не значит, что она не может найти что-нибудь бесполезное, но интересное. Список из сотни безделушек, которые могут разнообразить результаты обыска.

  • 100 готичных безделушек
    Вещички для приключения по ДнД в стиле ужастика или готики.

  • 101 любопытная вещица
    Забавные безделушки, которые можно найти во многих местах.

  • Вещицы с подвохом
    Безделушки, которые являются не тем, чем кажутся на первый взгляд.

  • Надгробья
    Разнообразные могилы и надгробья для прогулок по кладбищам.

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

  • Что можно найти в могиле
    Если крысы в подвалах таверны оказались слишком живучими, а лут собрать хочется, можно заняться грабежем могил. Конечно, это осуждается большинством народов, да и найти можно совсем не то, что ожидал… На свой страх и риск можно попробовать раскопать пару могил и вскрыть несколько склепов. К чему это приведет?..

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

Генератор и его внутреннее состояние

random.Random()
класс, который позволяет создать экземпляр генератора псевдослучайных чисел.

Иногда бывает удобно, а иногда необходимо иметь собственный экземпляр генератора:

Более того, таких экземпляров может быть несколько:

Причем все эти генераторы могут иметь разное внутреннее состояние, что очень удобно для воспроизводимости результатов:

random.SystemRandom()
класс, который позволяет создать экземпляр генератора, использующим в качестве источника случайности (энтропии) ресурсы операционной системы.

Данный клас основан на функции , которая возвращает n случайных байтов. Эта функция доступна не на всех операционных системах, но в зависимости от реализации источника энтропии в используемой системе, полученные данные могут быть использованы для криптографических целей (с определенными ограничениями, конечно же). В то же время, использование данной функции может быть не совсем удобно в плане того, что она нечувствительна к начальному состоянию :

А попытка узнать внутреннее состояние генератора (или установить его) вообще приведет к ошибке:

Traceback (most recent call last):
  File "", line 1, in 
NotImplementedError: System entropy source does not have state.
random.seed(a=None, version=2)
инициализирует генератор, или, простыми словами, задает его начальное состояние.

Данный метод очень удобен для воспроизводимости результатов, т.е. после инициализации одним и тем же значением , вы будете наблюдать одни и теже случайные данные

Например, если мне важно, что бы вы могли воспроизвести мои результаты на своем компьютере, то я обязательно укажу в примере кода начальное состояние:

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

Зачастую такая воспроизводимость необходима в тестировании всякого рода алгоритмов и их сравнении.

Если параметр не указан или равен None, то в качестве используется текущее системное время. Но в случае если используется системный генератор , то начальное состояние определяется реализацией источника этропии самой системы.

Праметр может быть установлен только в два значения: — все биты объектов str, bytes и bytearray используются для их преобразования в объект int; — преобразует str и bytes в более узкий диапазон объектов int:

random.getstate()
возвращает кортеж с параметрами внутреннего состояния генератора, который может быть использован для воссоздания этого состояния.

Возвращаемый кортеж очень велик:

Данный кортеж может быть передан функции для восстановления исходного состояния генератора.

random.setstate(state)
задает внутреннее состояние генератора на основе кортежа с его параметрами, который можно получить с помощью метода .

Данный метод отличается от тем что фиксирует состояние генератора, что называется «здесь и сейчас», т.е. состояние генератора в тот самый момент, когда оно было получено с помощью метода . Например, мы начали пользоваться генератором без инициализации начальным значением :

Теперь, мы уверены, что заполучив внутреннее состояние и установив его снова, мы увидим те же самые цифры, но нет!

Мы будем видеть те цифры, которые аблюдали после вызова :

random.getrandbits(k)
возвращает целое число состоящее из k случайных бит.

Благодаря данному методу может работать со сколь угодно большими диапазонами:

Генерация случайного n-мерного массива целых чисел

Для генерации случайного n-мерного массива целых чисел используется :

Python

import numpy

random_integer_array = numpy.random.random_integers(1, 10, 5)
print(«1-мерный массив случайных целых чисел \n», random_integer_array,»\n»)

random_integer_array = numpy.random.random_integers(1, 10, size=(3, 2))
print(«2-мерный массив случайных целых чисел \n», random_integer_array)

1
2
3
4
5
6
7
8

importnumpy

random_integer_array=numpy.random.random_integers(1,10,5)

print(«1-мерный массив случайных целых чисел \n»,random_integer_array,»\n»)

random_integer_array=numpy.random.random_integers(1,10,size=(3,2))

print(«2-мерный массив случайных целых чисел \n»,random_integer_array)

Вывод:

Shell

1-мерный массив случайных целых чисел

2-мерный массив случайных целых чисел

]

1
2
3
4
5
6
7

1-мерныймассивслучайныхцелыхчисел

101421

2-мерныймассивслучайныхцелыхчисел

26

910

36

Наш генератор случайных рандомных чисел онлайн.

Наш генератор рандомайзер не требует его скачивать на ваш персональный ПК. Все происходит в режиме генератор числа онлайн. Просто укажите такие параметры, как: диапазон чисел онлайн, в котором будут случайным образом выбраны числа. Так же укажите количество чисел, которое будет выбрано.
Для примера, у Вас есть группа Вконтакте.  В группе вы разыгрываете 5 призов, среди числа участников, которые сделают репост записи. С помощью специального приложения, мы получили список участников. Каждому присвоили свой порядковый номер для чисел онлайн.

Теперь переходим к нашему онлайн генератору и указываем диапазон чисел (количество участников). Например, задаем, что чисел онлайн необходимо 5, так как у нас 5 призов. Теперь жмем кнопку генерации. Тогда получаем 5 случайных чисел онлайн, в диапазоне от 1 до 112 включительно. Сгенерированые 5 чисел онлайн будут соответствовать порядковому номеру пяти участников, которые стали победителями розыгрыша. Все просто и удобно.

Еще один плюс генератор случайных чисел чисел в том, что все числа онлайн выдаются рандомным образом. Тоесть повлиять на него, либо вычислить, какое число будет следующем, не представляется возможным. Что делает генератор можно сказать, честным и надежным, а администрацию, которая разыгрывает призы с помощью нашего бесплатного генератора, честной и порядочной в лице участников конкурса. А если вы сомневаетесь относительно какого-то решения, то вы можете воспользоваться нашим генератором ответов да или нет.

Вероятностные распределения

random.triangular(low, high, mode)
возвращает случайное вещественное число из треугольного вероятностного распределения.

По умолчанию, минимальное и максимальное значения (левый и правый угол) равны \(0\) и \(1\), а координата вершины (mode) находится по середине, т.е. равна \(0.5\):

Но параметры распределения могут быть установлены в необходимые значения:

random.betavariate(alpha, beta)
возвращает случайное вещественное число из бета-распределения.

Параметры alpha и beta должны быть обязательно указаны, так как не имеют значений по умолчанию, и должны быть строго больше \(0\):

random.expovariate(lambd)
возвращает случайное вещественное число из экспоненциального (показательного) распределения.

Параметр , по хорошему, должен называться , но это зарезервированное слово языка Python.

random.gammavariate(alpha, beta)
возвращает случайное вещественное число из гамма-распределения.

Параметры alpha и beta должны быть обязательно указаны, так как не имеют значений по умолчанию, и должны быть строго больше \(0\):

random.gauss(mu, sigma)
возвращает случайное вещественное число из распределения Гауса.

По сути, выполняет то же самое что и , но немного быстрее:

random.normalvariate(mu, sigma)
возвращает случайное вещественное число из нормального распределения.
random.lognormvariate(mu, sigma)
возвращает случайное вещественное число из логнормального распределения.

— может быть любым, а вот — должна быть строго больше \(0\).

random.vonmisesvariate(mu, kappa)
возвращает случайный угол из интервала \(\) значение которого подчиняется закону распределения фон Мизеса.

— средний угол выраженный в радианах из интервала \(\), должен быть больше либо равен 0.

random.paretovariate(alpha)
возвращает случайное вещественное число из Парето распределения.
random.weibullvariate(alpha, beta)
возвращает случайное вещественное число из распределения Вейбулла.

Случайные последовательности

random.choice(seq)
возвращает случайный элемент из непустой последовательности , если пуст, то будет вызвано исключение IndexError.
random.shuffle(x)
Перемешивает элементы последовательности . Последовательность должна быть изменяемой,

Данная функция способна работать только с изменяемыми последовательностями, т.е. получить перестановку из строки или кортежа не получится, но если это необходимо, то можно воспользоваться преобразованием типов данных. Главное помнить, что данная функция ничего не возвращает, а изменяет непосредственно сам объект последовательности. Например, получить перестановку элементов кортежа можно как-то так:

Перестановка из строки может быть получена похожим образом:

Необязательный параметр принимает имя функции которая выдает случайные числа с плавающей точкой в диапазоне , с единственным условием – данная функция не должна принимать параметры. По умолчанию это функция :

Но мы можем использовать собственные функции:

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

random.sample(population, k)
возвращает список, который состоит из элементов взятых случайным образом из последовательности . При этом, сама последовательность остается без изменений.

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

Если последовательность содержит повторы, то они могут присутствовать и в возвращаемойй выборке:

В качестве могуть быть любые итерируемые объекты:

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

Как использовать модуль random в Python

Для достижения перечисленных выше задач модуль random будет использовать разнообразные функции. Способы использования данных функций будут описаны в следующих разделах статьи.

Теория и практика. Быстрая проверка задач и подсказки к ошибкам на русском языке.
Работает в любом современном браузере.

В самом начале работы необходимо импортировать модуль random в программу. Только после этого его можно будет полноценно использовать. Оператор для импорта модуля random выглядит следующим образом:

Python

import random

1 importrandom

Теперь рассмотрим использование самого модуля random на простом примере:

Python

import random

print(«Вывод случайного числа при помощи использования random.random()»)
print(random.random())

1
2
3
4
5

importrandom

print(«Вывод случайного числа при помощи использования random.random()»)

print(random.random())

Вывод:

Shell

Вывод случайного числа при помощи использования random.random()
0.9461613475266107

1
2

Выводслучайногочислаприпомощииспользованияrandom.random()

0.9461613475266107

Как видите, в результате мы получили . У вас, конечно, выйдет другое случайно число.

  • является базовой функцией модуля ;
  • Почти все функции модуля зависят от базовой функции ;
  • возвращает следующее случайное число с плавающей запятой в промежутке .

Перед разбором функций модуля random давайте рассмотрим основные сферы их применения.

6 ответов

51

Python часто описывается как язык с включенными «аккумуляторами», и это не исключение.

Существует только модуль для обработки IP-адресов и другой модуль для генерации случайных чисел. Составленные вместе, они делают именно то, что вы хотите, таким образом, что это немного читаемо (IMO).

В этом примере я буду считать, что переменная содержит либо , либо .

Здесь будет содержать полностью случайный IPv4 или IPv6-адрес.

Вы даже можете генерировать случайные адреса из такой подсети:

Здесь всегда будет содержать IP-адреса, такие как , и так далее. Он работает так же с IPv6-адресами, за исключением того, что вам придется импортировать и .

24

Вот несколько идей о вашем коде.

Проверьте аргументы командной строки

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

Использовать понимание списка

Список понятий чрезвычайно полезен и очень Pythonic. Это действительно хорошо, чтобы овладеть ими. Вот как использовать один для генерации случайного IPv4-адреса:

И адрес IPv6 немного сложнее, потому что нам нужны шестнадцатеричные цифры.

Это работает, потому что генерирует число в диапазоне от 0x10000 до 0x20000, и затем мы выбираем последние четыре шестнадцатеричных цифры.

19

Для кого-то, не знакомого с Python, вы выбрали довольно хорошие привычки. Не все используют функции или код сначала попытаются.

Говоря, я думаю, что было бы разумнее предоставить 2 функции вместо одного: и .

Вы также можете передать выражения генератора в . Они быстрее обрабатываются, чем + + и легче читать:

Осталось только проверить правильность подтверждения ввода 4 или 6:

13

Проверьте наличие недопустимых выходов и восстановите их.

Возможно, вы создадите вывод, зарезервированный для определенной цели, например loopback ( или )) или трансляцию (, , ). Пополняйте знание таких адресов, и если вы обнаружите, что создали его, замените его. Вы можете сделать это рекурсивно:

12

Подтвердите ввод: В настоящее время ваша программа

  • прерывает с помощью , если вызывается без аргументов,
  • прерывает с помощью , если вызывается с нецелым аргументом,
  • prints , если вызывается с целым аргументом, который не является
    или .

Отсутствующие или недопустимые аргументы должны печатать полезное сообщение об ошибке.
Большинство инструментов командной строки Unix выводит сообщение на стандартную ошибку
и завершение с ненулевым статусом выхода в случае сбоя.

Было бы проще сравнить данный аргумент с
строки и вместо преобразования его в целое число
(который может выйти из строя).

Используйте понимание списка вместо добавления к массиву в цикле.
Используйте как переменную итератора, если конкретное значение не требуется.

В качестве примера, случай «IPv4» может быть реализован как

Генератор случайных русских фамилий и имен

Генератор фамилий, имен и отчеств на русском языке (ФИО генератор) – это такая программа, которая может получить Вам случайные результаты. Если Вам необходимо придумать десяток имен, то наш сервис предоставлен именно на этот случай. Ведь бывают моменты, что фантазия и желание для их написания отсутствуют, а ФИО генератор без проблем и очень быстро решит этот вопрос. Благодаря нашему сервису Вы можете с легкостью и оперативно заполнить любую базу данных или придумать оригинальный ник/псевдоним, а также можете расширить свой круг познания в разнообразных именах.

Ситуации, когда необходимо придумать несколько фамилий, имен и отчеств нередки. Возможно, вам нужно заменить настоящие имена на выдуманные в журналистском расследовании или придумать яркие имена для персонажей рассказа или создать собственный псевдоним для использования в печати или интернете. Казалось бы, у нас в голове так много имен, отчеств и фамилий, но на ум приходит два, три, и наверняка банальные.

Рандомайзер списка FAQ

Для нужен рандомайзер списка?

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

Что нужно сделать для выбора победителя?

Введите в текстовое поле «список участников» имена, логины или никнеймы участников. Каждого участника следует ввести с новой строки! После чего нажмите кнопку «Генерировать». В результате вы получите пронумерованный список этих участников в случайном порядке.

Можно ли сохранить результаты розыгрыша?

Да. Но перед началом розыгрыша следует поставить переключатель «Сохранить результат?» в положение «ДА». После рандомизации списка в верху над результатами вы получите постоянную ссылку на эту рандомизацию с датой розыгрыша.

Рандомайзер списка описание

Рандомайзер легкий способ определить победителя онлайн. У вас есть список участников. Вставте его в поле ввода друг под другом. Сделайте один клик и наш рандомайзер пронумерует случайным образом всех участников. Такой рандомайзер можно использовать во многих сферах:

  • определение победителей розыгрышей
  • выбрать победителя из списка
  • расстановка игроков
  • Кто пойдет первый к доске

А ведь наш рандомайзер использует несколько алгоритмов одновременно. Это гарантирует полную случайность выбора победителя. Список перемешивается несколько раз случайным образом. И вы можете быть уверены, что рандомайзер сделает настоящий случайный выбор. Простой интерфейс рандомайзера компенсирует сложность алгоритмов. Пользуйтесь нашим рандомайзером для действительно честного выбора победителя онлайн!

Нужно определить победителя для розыгрыша или конкурса онлайн? Нет ничего проще. Вставьте список участников в текстовое поле на этой странице. Нажмите кнопку генерировать ниже. В полученном результате появится список участников с номером.
Каждому участнику предоставляется номер в случайном порядке. Здесь количество номеров соответствует количеству участников розыгрыша. Снимите процесс выбора победителя на видео. Таким образом вы определите победителя любого конкурса онлайн.

Победители конкурса определены

Онлайн генератор случайных чисел или рандомайзер определит победителя честно. Это самый простой способ слепого выбора. Уже не нужно тянуть билетик с лототрона. Достаточно ввести список претендентов и выбрать победителя. Снимая процесс случайного выбора на видео вы обеспечите честный розыгрыш. Кроме такого варианта определения победителей у нас еще есть отложенный розыгрыш случайных чисел. Этот розыгрыш будет полезным для одновременного просмотра результата розыгрыша. Правда в таком случае вы получите только номера победителей конкурса. То есть номера надо присвоить участникам заранее.

Ссылка на основную публикацию