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

Рандомайзер

07.12.2021, 22:22. Показов 4594. Ответов 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
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
08.12.2021, 20:03
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от hoggy Посмотреть сообщение
требования к решению задачи зависят только от самой задачи,
кроме конкретных задач существуют более общие классы задач.
или нет?

Цитата Сообщение от hoggy Посмотреть сообщение
возьми любую, но конкретную задачу на криптографию,
и попробуй объяснить: чем конкретно тебя rand не устроил.
я говорил не конкретно о rand(), а о обычных PRNG в принципе.
а за примерами далеко ходить не надо: https://xakep.ru/2021/07/07/ka... nager-bug/
и тут ещё не rand() использовался(скорее всего).
всё сводится к одному: угадал сид - сбрутил пароли.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.12.2021, 20:27
Цитата Сообщение от GbaLog- Посмотреть сообщение
или нет?
нет.

Цитата Сообщение от GbaLog- Посмотреть сообщение
а за примерами далеко ходить не надо: https://xakep.ru/2021/07/07/ka... nager-bug/
смахивает на маркеттинговое бла-бла-бла.

Цитата Сообщение от GbaLog- Посмотреть сообщение
всё сводится к одному: угадал сид - сбрутил пароли.
"всё" сводится к бла-бла-бла.
а на деле запароленный rar ломануть не могут.

сможешь написать софтинку,
которая реально сможет ломануть пароль,
если ей на вход подать время его создания?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
08.12.2021, 21:11
Цитата Сообщение от hoggy Посмотреть сообщение
нет.
ну тогда и говорить не о чем.
Цитата Сообщение от hoggy Посмотреть сообщение
смахивает на
а это на чо смахивает: https://donjon.ledger.com/kasp... d-manager/ ?
CVE, я так полагаю, тоже завели тоже чисто по-приколу, а чо б и нет.
маркетинговый ход в пользу Касперского.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
08.12.2021, 21:43
Цитата Сообщение от GbaLog- Посмотреть сообщение
он выдаёт псевдо-случайные числа, а не случайные.
для криптографии, например, такое неприемлемо.
А расшифровывать как будешь? Случайные числа они на то и случайные, что никогда не повторяются.

Для шифрования как раз используются псевдо-случайные числа - потому что эту последовательность можно повторить, если знать пароль.

Случайные числа невозможно получить математически, только аппаратно. Например, количество милисекунд, прошедших с момента включения компьютера - вряд-ли сможешь 2 раза получить одинаковое число. Или какая-нить специальная микросхема, которая физически генерирует случайные числа.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
08.12.2021, 21:55
Цитата Сообщение от Oyage Посмотреть сообщение
других вариантов особо и не нашёл
Вот неплохая статься на тему ГСЧ, посмотрите, может оттуда что-то возьмете.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
08.12.2021, 22:11
1. Нафига доверять сторонней программе создавать за тебя пароли, если лучший ГСЧ у тебя в голове?
2. Если уж совсем нет рэндомной фантазии - напиши программу, которая будет быстро-быстро перебирать буквы, цифры и символы. И по нажатию кнопки добавляй в строку ту, на которую в данный момент показывает счётчик. Закрой глаза и жми на кнопку с заведомо нерегулярными паузами - получишь случайный пароль.

Добавлено через 8 минут
Если вы пишите проекты чуть более сложные, чем Hello World, то "случайности" ГСЧ (а правильнее ГПСЧ) srand вам попросту не хватит, несложно будет вычислить порядок следования последовательности, и вызов будет происходить в одно и то же время, давая одинаковый результат.
Чё за чушь тут несут? Кто-нибудь может нажать в своей программе кнопку через одинаковое количество милисекунд от включения компьютера? Может попробуете? А если специально не стараться? Включил комп - сходил попИсал, потом помыл руки, и заодно почистил зубы - сможешь сделать это 2 раза за одинаковое время с точностью до милисекунды?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.12.2021, 23:17
Цитата Сообщение от GbaLog- Посмотреть сообщение
а это на чо смахивает:
смахивает на ссылку,
на которую ссылается статья по твоей предыдущей ссылке.

ты заявил:
Цитата Сообщение от GbaLog- Посмотреть сообщение
для криптографии, например, такое неприемлемо.
но в представленных тобой статьях нет ответа на вопрос:
Цитата Сообщение от hoggy Посмотреть сообщение
это ещё почему?
предоставленные тобой ссылки - это теория, а не практика.
в ней нет информации ни об одном реальном взломе "слабого пароля".
и как по мне, сами данные тоже сомнительные.

я не великий математик, и могу ошибаться.
но у меня очень большие сомнения насчет этого заявления:
«Последствия [использования такого механизма] определенно были скверные: любой пароль мог быть взломан. Например, между 2010 и 2021 годом прошло 315619200 секунд, поэтому KPM может сгенерировать не более 315619200 паролей для заданного набора символов. Их перебор занимал всего несколько минут»
обрати внимание: не "был", а "мог быть".
тобишь, это не более, чем домыслы теоретика.

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

а покамест, как я и писал выше:
Цитата Сообщение от hoggy Посмотреть сообщение
требования к решению задачи зависят только от самой задачи
в каких то случаях может и не приемлимо.
а в каких то - вполне себе приемлимо.
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
12.12.2021, 07:09
Цитата Сообщение от hoggy Посмотреть сообщение
rnd_() % (maxVal - minVal + 1) + minVal;
Хм.
Я всегда считал, что если генератор rand() равномерно генерит числа от нуля до X, то если брать rand() % (X-N), то значения до N будут встречаться чаще в результате такой операции. Это и породит неравномерное распределение независимо от самого качества функции rand().

Цитата Сообщение от hoggy Посмотреть сообщение
или же ты сможешь на практике продемонстрировать неравномерность?
Показываю:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <random>
#include <unordered_map>
 
int main() {
 
    std::random_device rd;
    std::mt19937 gen(rd());
    // возьмем равномерный генератор в маленьком диапазоне для наглядности
    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]; // обрежем у них диапазон
    }
 
    // ну и посмотрим на их распределение
    for (int i = 0; i < 10; ++i) {
        std::cout << i << ": " << counter[i] << std::endl;
    }
 
    return 0;
}
Угадайте результат.
Кликните здесь для просмотра всего текста
Первые шесть значений очевидно будут встречаться в два раза чаще.
Code
1
2
3
4
5
6
7
8
9
10
0: 1919
1: 1866
2: 1850
3: 1888
4: 1876
5: 1865
6: 981
7: 895
8: 926
9: 934


Для rand() % X с большим RAND_MAX показать, конечно, сложнее гораздо. Но суть та же. Ограничение диапазона приведёт к неравномерному распределению.

Добавлено через 3 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
конэнгурентная формула
К формуле нема претензий. Претензии к rand() % X, где rand() сколь угодно качественно равномерно распределяет величины от 0 до какого-то значения, не кратного X.

Добавлено через 9 минут
Цитата Сообщение от hoggy Посмотреть сообщение
именно что?
Именно то, что я написал выше:
Цитата Сообщение от lemegeton Посмотреть сообщение
non-portable, with unpredictable and oft-questionable quality and performance
Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
сомневаюсь, что глядя на них ты сможешь определить,
Конечно нет. Яж не робот. Да и вообще в теме генерации случайных значений -- случайный человек.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
12.12.2021, 09:06
Цитата Сообщение от lemegeton Посмотреть сообщение
Для rand() % X с большим RAND_MAX показать, конечно, сложнее гораздо. Но суть та же. Ограничение диапазона приведёт к неравномерному распределению.
Чушь. Это твой "равномерный генератор в маленьком диапазоне для наглядности" косячит. Вот обычный стандартный rand() работает. И для проверки - линейная конгруэнтная функция с хорошими коэффициэнтами:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// мой RND
int my_rand(int x)
{
    x = (x * 379 + 1) % 32771;
    return x;
}
 
 
 
// нажатие кнопки
void Widget::press_pbtn_01()
{
    int k;
    int bufer[10];
    QString str;
 
    // 1
    ui->label_01->setText("x = std::rand() % 10");
 
    std::srand(123);
 
    for(int i = 0; i < 10; i++) bufer[i] = 0;
 
    for(int i = 0; i < 15000; i++)
    {
        k = std::rand();
        bufer[k % 10]++;
    }
 
    for(int i = 0; i < 10; i++)
    {
        str = QString::number(bufer[i]);
        ui->textEdit_01->append(str);
    }
 
 
 
    // 2
    ui->label_02->setText("x = (x * 379 + 1) % 32771");
 
    k = 123;
 
    for(int i = 0; i < 10; i++) bufer[i] = 0;
 
    for(int i = 0; i < 15000; i++)
    {
        k = my_rand(k);
        bufer[k % 10]++;
    }
 
    for(int i = 0; i < 10; i++)
    {
        str = QString::number(bufer[i]);
        ui->textEdit_02->append(str);
    }
}
Миниатюры
Рандомайзер  
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
12.12.2021, 14:21
Цитата Сообщение от alexu_007 Посмотреть сообщение
Это твой "равномерный генератор в маленьком диапазоне для наглядности" косячит

Процитирую уважаемого hoggy, "ты сможешь на практике продемонстрировать неравномерность?"

Цитата Сообщение от alexu_007 Посмотреть сообщение
обычный стандартный rand() работает
Да работает он, ктож спорит?
Ваш myrnd() даёт значения в диапазоне от 0 до 32771. Равномерно? Допустим.
Но если отсекать myrnd() % 30000 -- он не будет давать равномерное распределение.
И числа от нуля до 2771 будут встречаться чуть чаще.
Почему?

Просто потому, что число 1 и число 30001 в равномерном распределении должны встречаться одинаково часто.
То есть, что 1 что 30001 должно встречаться с одинаковой вероятностью 1/32771.
А 1 % 30000 и 1 % 30001 для обоих случаев дают в результате 1. То есть единица начнет встречаться банально чаще, с вероятностью 1/32771 + 1/32771.
То же самое для всех остальных значений от 0 до 2771.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.12.2021, 14:21
Цитата Сообщение от lemegeton Посмотреть сообщение
всегда считал, что если генератор rand() равномерно генерит числа от нуля до X, то если брать rand() % (X-N), то значения до N будут встречаться чаще в результате такой операции.
ты ошибаешься.
причем, у тебя ошибка не в математике, а в логике.
что бы осознать эту ошибку, не нужно владеть тервером.


итак, по порядку:

1. ты привел не_корректную формулу диапазона.

математически корректная формула: rnd() % (maxVal - minVal + 1) + minVal;
где: rnd() - псч на всем диапазоне

специально ещё раз повторю: rnd() - псч на всем диапазоне
это - очень важный момент.

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

запомни:
неправильно: rand() % (X-N)
правильно: rnd() % (maxVal - minVal + 1) + minVal;

формула корректна с точки зрения математики.
но не_корректна с точки зрения с++.

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


на максимальном диапазоне там будет краш (следствие UB)

стандартные инструменты,
такие как std::uniform_int_distribution<int> distribution(a, b);
используют более сложный алгоритм,
который учитывает особенность арифметики с++,
и связанные с ним UB.

но поскольку проблема сугуба техническая, а не математическая,
то мы проигнорируем этот факт.


3. для иллюстрации момента,
возьмем мой экспериментальный дайс из #9
он удобен в том плане, что наглядно видна вся подноготная.

https://rextester.com/IXAEB69731


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <cassert>
#include <ctime>
 
struct dice
{
    static int 
    random(const int minVal, const int maxVal) noexcept
    {
        assert(minVal<=maxVal);
        // TODO: на пограничных значениях даст сбой
        return rnd_() % (maxVal - minVal+1) + minVal;
    }
private: 
    static int rnd_() noexcept
    { 
        // TODO: clock - не самый удачный инициализитор сидов
        static thread_local int seed
            = static_cast<int>(clock());
        return (((seed = seed * 214013 + 2531011) >> 16)& 0x7fff);
    }
};
 
//===============================================================
//===============================================================
 
#include <iostream>
#include <string>
#include <map>
 
int main()
{
    std::map<int, std::size_t>
        counter;
    
    for (size_t i = 0; i < 15'000; ++i) 
        ++counter[dice::random(0, 9)];
 
    for (const auto& pair: counter)
        std::cout << pair.first << ": " << pair.second << '\n';
}
вывод в консоль:
Code
1
2
3
4
5
6
7
8
9
10
0: 1572
1: 1501
2: 1525
3: 1476
4: 1489
5: 1463
6: 1477
7: 1467
8: 1522
9: 1508
мы видим, что распределение в пределах нормы.

4. а что сделал ты в своём примере?
ты взял уже готовое число из заданного диапазона, и ещё раз его обрезал.

вот здесь у тебя уже дайс выдаёт в нужном диапазоне:
Цитата Сообщение от lemegeton Посмотреть сообщение
std::uniform_int_distribution<unsigned char> random(0, 15);
а здесь ты уже готовый результат обрезаешь ещё раз:
Цитата Сообщение от lemegeton Посмотреть сообщение
++counter[random(gen) % 10];
так делать нельзя.

5. в итоге, что на самом деле показывает твой неудачный пример?
он показывает частоту отстатков от деления от чисел в диапазоне от 0 дол 15

вот что ты сделал:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <map>
 
int main()
{
    std::map<size_t, size_t> cnt;
    
    for(size_t i = 0; i < 16; ++i)
        ++cnt[i%10];
    
    for(const auto& pair: cnt)
        std::cout << pair.first << ": " << pair.second << '\n';
}
Code
1
2
3
4
5
6
7
8
9
10
0: 2
1: 2
2: 2
3: 2
4: 2
5: 2
6: 1
7: 1
8: 1
9: 1
-----------------------------------

Цитата Сообщение от lemegeton Посмотреть сообщение
Именно то, что я написал выше:
нет, ты чушь сейчас несешь.
ты сослася на документацию, заявляя, что якобы там где-то что-то обрезается.

ну так вот, из документации никак не следует,
что где-то что-то будет обрезаться.

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

на основании такой информации нельзя делать выводов о поведнии rand
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
12.12.2021, 14:38
Цитата Сообщение от alexu_007 Посмотреть сообщение
линейная конгруэнтная функция с хорошими коэффициэнтами
Повторюсь. К конгруэнтной функции претензий никаких. Равномерная, всё в порядке с ней.
Но когда мы берём остаток от деления на не кратное максимальному значению, мы изменяем распределение случайных чисел.

Добавлено через 15 минут
Цитата Сообщение от hoggy Посмотреть сообщение
ты ошибаешься
Так бывает. Это не страшно. Я хочу разобраться.

Цитата Сообщение от hoggy Посмотреть сообщение
запомни:
неправильно: rand() % (X-N)
правильно: rnd() % (maxVal - minVal + 1) + minVal;
minVal = 0, maxVal = 9
Получаем rand() % (9 - 0 + 1) + 0?
Не вижу, как это отличается от rand() % 10.

Цитата Сообщение от hoggy Посмотреть сообщение
псч на всем диапазоне
Цитата Сообщение от hoggy Посмотреть сообщение
return (((seed = seed * 214013 + 2531011) >> 16)& 0x7fff);
Я правильно понимаю, что такая функция даёт число, равномерно распределённое на всём диапазоне от 0 до 0x7fff?
То есть числа 1 и 32001 нам встретятся с одинаковой вероятностью 1/0x7fff?
С какой вероятностью будет встречаться число 1, если брать "rnd_() % (32000 - 0 + 1) + 0"?


Цитата Сообщение от hoggy Посмотреть сообщение
ты сослася на документацию, заявляя, что якобы там где-то что-то обрезается.
Я сослался на документацию, заявляя то, что в документации написано, что
Цитата Сообщение от lemegeton Посмотреть сообщение
В стандарте оно называется Low-quality random number generation.
и
Цитата Сообщение от lemegeton Посмотреть сообщение
The other random number generation facilities in this document ([rand]) are often preferable to rand, because rand's underlying algorithm is unspecified. Use of rand therefore continues to be non-portable, with unpredictable and oft-questionable quality and performance.
Пожалуйста, не надо мне приписывать то, что я не заявлял. )
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.12.2021, 14:49
Цитата Сообщение от lemegeton Посмотреть сообщение
и
и как это связанно с той чушью, что ты выше затирал?

напоминаю:
Цитата Сообщение от lemegeton Посмотреть сообщение
если делать обрезание -- будет неравномерно.
В стандарте оно называется Low-quality random number generation.
нет никакого "оно".

нет вообще никакой связи между стандартном,
и тем, что ты не умеешь правильно обрезать рандом для получения диапазона.
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
12.12.2021, 15:14
Цитата Сообщение от hoggy Посмотреть сообщение
и как это связанно с той чушью, что ты выше затирал?
Никак.
Цитата Сообщение от hoggy Посмотреть сообщение
нет вообще никакой связи между стандартном,
и тем, что ты не умеешь правильно обрезать рандом для получения диапазона.
И такой связи я тоже нигде не заявлял.


Не по теме:

Или, выражаясь вашим языком:
Ты ошибаешься.
Как можно нести такую чушь и связывать несвязанные вещи?
То, что два не связанных высказывания идут подряд не означает, что они как-то связаны.



Добавлено через 15 минут
Цитата Сообщение от hoggy Посмотреть сообщение
он показывает частоту отстатков от деления от чисел в диапазоне от 0 дол 15
Вот тут я и не понимаю какого-то факта.

Я не вижу, как отличаются функция, возвращающая равномерно распределённое случайное число в диапазоне от 0 до 15 от функции, возвращающей равномерно распределённое случайное число в диапазоне от 0 до 0x7fff.

Почему не должно быть такого же эффекта неравномерности выпадающих значений только гораздо менее выраженного?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.12.2021, 15:17
Цитата Сообщение от lemegeton Посмотреть сообщение
То, что два не связанных высказывания идут подряд не означает, что они как-то связаны.
конечно не означает.
ведь иногда люди просто несут чушь.

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

то ли у людей проблема с логикой.
то ли - с русским языком.
то ли всё вместе.

Цитата Сообщение от lemegeton Посмотреть сообщение
Как можно нести такую чушь и связывать несвязанные вещи?
так я и обратил внимание, что связи нет.

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

например:
Катя весело прыгала на скакалке.
Она была жизнерадостной и спортивной девочкой.
"Она" - это кто? "Она" - это "Катя".

теперь твой вариант:

Цитата Сообщение от lemegeton Посмотреть сообщение
если делать обрезание -- будет неравномерно.
В стандарте оно называется Low-quality random number generation.
"оно" - это кто? "оно" - это "обрезание" ?

с точки зрения грамматики русского языка, кажется что да, "обрезание".
но с точки зрения здравого смысла - это просто чушь.
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
12.12.2021, 15:28
Цитата Сообщение от hoggy Посмотреть сообщение
конечно не означает.
ведь иногда люди просто несут чушь.

Не по теме:

Мне очень тяжело будет поддерживать диалог в таком пафосно-надменном пассивно-агрессивном тоне, но я постараюсь, если вам, уважаемый hoggy, будет так удобнее.



Ваше неумение понимать контекст и желание связать всё до состояния каши по прежнему их никак не связывает.
Сейчас вы несёте чушь и уходите от темы.

Еще раз вопросы: "rand() % (9 - 0 + 1) + 0" даст такие же результаты как "rand() % 10"?
Если функция rnd_() даёт равномерно распределённые значения между 0 и 32676, а функция rand() дает равномерно распределённые значения от 0 до 15, то почему "rand() % (9 - 0 + 1) + 0" - "так делать нельзя", а "rnd_() % (29999 - 0 + 1) + 0" - всё окей и равномерно?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.12.2021, 15:45
Цитата Сообщение от lemegeton Посмотреть сообщение
Ваше неумение понимать контекст
как это интересно у тебя получается.

два никак несвязанных предложения написал ты,
а проблемы с пониманием контекста якобы у меня.
ну-ну.

Цитата Сообщение от lemegeton Посмотреть сообщение
Сейчас вы несёте чушь и уходите от темы.
это какую такую чушь я несу?

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

это - не какое то моё личное мнение.
это - русский язык.
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
12.12.2021, 15:59
Цитата Сообщение от hoggy Посмотреть сообщение
ты сам признал,
что написал два несвязанных друг с другом предложения.
Не надо быть семи пядей во лбу, чтобы это заметить. Я рад, что ты наконец-то это осознал после двух моих явных указаний на это.

Цитата Сообщение от hoggy Посмотреть сообщение
это - русский язык.
Я не хочу больше читать отвлеченную чушь.


Ты так и не ответил ни на один из вышеприведённых вопросов.

Еще раз вопросы:

Так всё же "rand() % (9 - 0 + 1) + 0" даст такие же результаты как "rand() % 10"?

Если функция rnd_() даёт равномерно распределённые значения между 0 и 32676, а функция rand() дает равномерно распределённые значения от 0 до 15, то почему "rand() % (9 - 0 + 1) + 0" - "так делать нельзя", а "rnd_() % (29999 - 0 + 1) + 0" - всё окей и равномерно?

Не по теме:

Так удобнее общаться? Не дотягиваю с пафосом немного, понимаю. Маловато опыта.

0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
12.12.2021, 16:42
Цитата Сообщение от lemegeton Посмотреть сообщение
Но когда мы берём остаток от деления на не кратное максимальному значению, мы изменяем распределение случайных чисел.
Честно говоря я не очень понимаю, о чём речь.
Вот формула линейной конгруэнтной функции: x = (x * 379 + 1) % 32771;

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

C
1
2
3
x = (x * 379 + 1) % 32771;
а = х % 20000;
а = a % 10;
Вы это имели ввиду? Я проверил - это ничего не меняет, числа одинаковые.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.12.2021, 16:53
Цитата Сообщение от alexu_007 Посмотреть сообщение
Честно говоря я не очень понимаю, о чём речь.
он имеет ввиду формулу: RND % X
где RND - возвращает число с нормальным распределением.
а X - некоторое произвольное число из диапазона RND.

штука в том, что если принять за истину, что RND даст распределение K
тогда RND % X даст распределение B,
где B хуже чем K

таким образом,
формулы извлечения псч в нужном диапазоне,
которые используют отстаток от деления,
дают результат с более худшим распределением,
в сравнении с базовым RND
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.12.2021, 16:53

Почему не работает рандомайзер
Ошибок не выдаёт, но всё время выдаёт 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 ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли Введение: Экологический рынок как игра с нулевой суммой Традиционная экология долгое время. . .
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ Введение: Синдром «цифрового учебника» Современные большие языковые модели (LLM) обладают колоссальным. . .
Главный вопрос моделирования сукцессии
anaschu 27.06.2026
главный вопрос. Если эктомикориза лучше добывает недоступный фосфор. И ее масса максимальна из всех. А широколиственный лес тоже имеет самую крутую биомассу. То почему не возникло их симбиоза? Это. . .
сукцессия 6. Питон реализация энилоджиковской модели, картинка про Центральную часть будущей модели
anaschu 26.06.2026
Етить. ИИ мне на основе моего старого файла R создал вот эту вот хмерь на пайтоне. Это уже новая модель, модель сукцессии грибной. потоки фосфора, азота. Углерода. 5 видов организмов. Я даже. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru