Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
1 / 1 / 0
Регистрация: 05.05.2020
Сообщений: 186

Рандомайзер

07.12.2021, 22:22. Показов 4820. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как можно реализовать максимально рандомный рандомайзер от 0 до 32767 через rand()

Пробовал через библиотеку <time.h>
Но там числа буквально на единицу отличаются друг от друга
А других вариантов особо и не нашёл, везде описана дефолтная работа функции
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.12.2021, 22:22
Ответы с готовыми решениями:

Рандомайзер
Задание: создать масив чисел, память под масив выделить динамически. В ячейки масива занести рандомные числа, найти и вывести на экран...

Рандомайзер не работает
Добрый день! Почему-то не работает рандомайзер, выдает одинаковые значения... Хотя srand(time(0)) прописан. В итоге нужно заполнять...

Рандомайзер слов на C++
Создание рандомайзера слов в вижуал студио 2010 На c++

49
738 / 705 / 110
Регистрация: 29.05.2015
Сообщений: 4,362
12.12.2021, 18:05
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от hoggy Посмотреть сообщение
формулы извлечения псч в нужном диапазоне,
которые используют отстаток от деления,
дают результат с более худшим распределением,
в сравнении с базовым RND
Нормальный результат распределения дают, я же показал. Всех цифр примерно поровну. Ну давайте посмотрим 100 000 раз, каждой цифры должно быть приблизительно по 10 000. И при разных значениях srand(). Я уж не знаю, как ещё пробовать?
Миниатюры
Рандомайзер  
0
 Аватар для lemegeton
4904 / 2697 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
12.12.2021, 18:21
Уважаемый hoggy все правильно сказал. Именно это я и имею в виду.

Позволю себе заметить лишь, что на практике равномерное распределение происходит в каком-то диапазоне [A:B] длинной D.

В случае если сужать диапазон до длины X, то равномерность сохранится в случае если D mod X == 0.
0
738 / 705 / 110
Регистрация: 29.05.2015
Сообщений: 4,362
12.12.2021, 21:05
Ну хорошо. Хочется конкретики. В моём случае:
C++ (Qt)
1
x = (x * 379 + 1) % 32771;
на каком диапазоне [A:B] длинной D будет равномерное распределение, и при какой длине Х равномерность не сохранится?
0
 Аватар для lemegeton
4904 / 2697 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
12.12.2021, 21:22
Давайте попробую еще раз объяснить.
Цитата Сообщение от hoggy Посмотреть сообщение
штука в том, что если принять за истину, что RND даст распределение K
тогда RND % X даст распределение B,
где B хуже чем K
Поясню на пальцах. Допустим.
C++
1
2
3
4
5
int my_rand(int x)
{
    x = (x * 379 + 1) % 32771;
    return x;
}
Если принять за истину, что функция my_rand даст равномерное распределение в диапазоне между 0 и 32771,
тогда my_rand() % 30000 даст менее равномерное распределение с небольшим перекосом в сторону первых 2771 чисел.

Смысл в том, что даже если my_rand равномерно распределяет в диапазоне между 0 и 32771, при обрезании диапазона с помощью остатка от деления например my_rand() % 30000 получившиеся значения не будут равномерно распределены между 0 и 30000 с легким перекосом в сторону первых чисел.

Цитата Сообщение от lemegeton Посмотреть сообщение
Позволю себе заметить лишь, что на практике равномерное распределение происходит в каком-то диапазоне [A:B] длинной D.
В случае если сужать диапазон до длины X, то равномерность сохранится в случае если D mod X == 0.
Моё несущественное замечание говорит лишь о том, что если бы диапазон делился на что-то кроме себя и единицы, то при приведении к другому кратному диапазону через остаток от деления сохранялось бы равномерное распределение.

Например, если бы функция rand() равномерно распределяла значения между 0 и 1000, то при сокращении диапазона до 100 с помощью rand() % 100 получившиеся значения были бы всё равно равномерно распределены.
0
738 / 705 / 110
Регистрация: 29.05.2015
Сообщений: 4,362
12.12.2021, 22:17
Цитата Сообщение от lemegeton Посмотреть сообщение
Если принять за истину, что функция my_rand даст равномерное распределение в диапазоне между 0 и 32771,
тогда my_rand() % 30000 даст менее равномерное распределение с небольшим перекосом в сторону первых 2771 чисел.
Теоретически да. Практически это ни на что не повлияет. Во первых, редко встречаются задачи, в которых требуются все 30000 случайных чисел. 2, 4, 8, 10, 16, ну 256 для шифрования байтов - на таких количествах перекос будет меньше влияния "случайности". Во вторых, для больших чисел и база должна быть существенно больше. Кстати, для std::rand она равна не то 2, не то 4 млрд. - более чем достаточно, что-бы погрешность стала ничтожной.
0
 Аватар для lemegeton
4904 / 2697 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
12.12.2021, 23:12
Цитата Сообщение от alexu_007 Посмотреть сообщение
Практически это ни на что не повлияет.
В каких-то простых случаях -- безусловно ни на что не повлияет.
В специфичных случаях, когда нужно равномерное распределение с гигантским количеством генерируемых случайных чисел -- может и повлиять.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
12.12.2021, 23:59
Цитата Сообщение от lemegeton Посмотреть сообщение
когда нужно равномерное распределение
это уже не рандомный случай ))
Да и вообще по теме, ну тут много вариантов.

Добавлено через 3 минуты
lemegeton, одна твоя ошибка из-за которой начался ваш бессмысленный спор.
Это ваш неудачный пример :
std::uniform_int_distribution<unsigned char> random(0, 15);

// заведем счётчик
std::unordered_map<unsigned char, std::size_t> counter;

// сгенерим немножко случайных чисел
for (int i = 0; i < 15000; ++i) {
++counter[random(gen) % 10]; // обрежем у них диапазон
там где из 15 случайных чисел выбиралось лишь 5

Добавлено через 1 минуту
lemegeton, генерация случайных чисел до сих пор актуальный предмет многих ученых.
Почему нельзя сказать что случайных чисел не существует, в природе, вообще ))) ???
0
 Аватар для Kuzia domovenok
4268 / 3328 / 926
Регистрация: 25.03.2012
Сообщений: 12,545
Записей в блоге: 1
13.12.2021, 00:00
Значения больше и меньше середины диапазона распределяются как 66% к 33%
если диапазон задан от 0 до RAND_MAX / 3 * 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cstdlib>
#include <ctime>
 
 
using namespace std;
int main()
{
    srand(time(NULL));
    int a = 0, b = RAND_MAX / 3 * 2, mid = RAND_MAX / 3;
    int cnt_greater = 0, cnt_less = 0;
    for (int i = 0; i < 1000000; ++i)
    {
        int rnd = rand() % (b - a + 1) + a;
        if (rnd > mid) ++cnt_greater;
        else ++cnt_less;
    }
    cout << "greater " << 100 * cnt_greater / (cnt_greater + cnt_less) << "%" << endl;
    cout << "less " << 100 * cnt_less / (cnt_greater + cnt_less) << "%" << endl;
    return 0;
}
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.12.2021, 00:02

Не по теме:

Kuzia domovenok, слушай, может мы в одном городе живем ? лол )



Добавлено через 32 секунды
Или ты за одну минуту наваял код .
0
 Аватар для lemegeton
4904 / 2697 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
13.12.2021, 05:17
Цитата Сообщение от SmallEvil Посмотреть сообщение
одна твоя ошибка из-за которой начался ваш бессмысленный спор
В этом коде нет ошибки. Он призван был продемонстрировать, что ограничение диапазона равномерно распределённых случайных величин методом взятия остатка может привести к неравномерному распределению величин внутри нового диапазона.

Цитата Сообщение от SmallEvil Посмотреть сообщение
Почему нельзя сказать что случайных чисел не существует, в природе, вообще ))) ???
Вроде как и нет, а вроде как и есть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.12.2021, 05:17

Почему не работает рандомайзер
Ошибок не выдаёт, но всё время выдаёт 0 #include &quot;pch.h&quot; #include&lt;iostream&gt; #include&lt;fstream&gt; #include &lt;string&gt; #include...

Неправильно работает рандомайзер в стеке
Рандомайзер выдаёт только одно число в стеке. #include &lt;iostream&gt; #include &lt;stack&gt; // подключаем библиотеку для // использования...

Рандомайзер
Такой вопрос мне получается нужно сделать чтоб рандом выдавал степенные числа 2 и 3х. Как это возможно реализовать. Буду благодарен за...

Простой рандомайзер
Уважаемые форумчане, доброго времени суток! Мне понадобилась реализация генератора псевдослучайных чисел от 0 до 8. Я придумал следующее: ...

Рандомайзер с условием
Ребятки, хелп!:senor: Создал рандомайзер в VBA Excel: Private Sub CommandButton1_Click() Dim i As Byte Dim Rand As Range ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
50
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru