1 / 1 / 0
Регистрация: 05.05.2020
Сообщений: 186

Рандомайзер

07.12.2021, 22:22. Показов 4627. Ответов 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
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,331
12.12.2021, 18:05
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от hoggy Посмотреть сообщение
формулы извлечения псч в нужном диапазоне,
которые используют отстаток от деления,
дают результат с более худшим распределением,
в сравнении с базовым RND
Нормальный результат распределения дают, я же показал. Всех цифр примерно поровну. Ну давайте посмотрим 100 000 раз, каждой цифры должно быть приблизительно по 10 000. И при разных значениях srand(). Я уж не знаю, как ещё пробовать?
Миниатюры
Рандомайзер  
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
12.12.2021, 18:21
Уважаемый hoggy все правильно сказал. Именно это я и имею в виду.

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

В случае если сужать диапазон до длины X, то равномерность сохранится в случае если D mod X == 0.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,331
12.12.2021, 21:05
Ну хорошо. Хочется конкретики. В моём случае:
C++ (Qt)
1
x = (x * 379 + 1) % 32771;
на каком диапазоне [A:B] длинной D будет равномерное распределение, и при какой длине Х равномерность не сохранится?
0
 Аватар для lemegeton
4903 / 2696 / 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
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,331
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
4903 / 2696 / 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 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,544
Записей в блоге: 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
4903 / 2696 / 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru