Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407

Генерация длинных случайных чисел в заданном диапазоне

21.11.2023, 09:17. Показов 874. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Я разрабатываю метод, который бы генерировал числа в нужном диапазоне от BigInt a до BigInt b
Исходный набор случайности выглядит как группа байт
Как генерировать числа от a до b без пробы, ровно по границам?

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
BigInt InSomnia::Rand_Gen::generate_random_bigint(const BigInt &left, const BigInt &right)
{
    if(left == right)
    {
        return left;
    }
    const BigInt delta = right - left;
    const int32_t len_bits_max = delta.getString(2).length();
    const int32_t len_bytes_max = len_bits_max / 8;
    const int32_t len_bytes_min = 0;
 
    const int32_t random_len_bytes =
            this->generate_random_int32_t(len_bytes_min, len_bytes_max);
 
    for(;;)
    {
        const BigInt random_big_int_delta =
            this->generate_random_bigint(random_len_bytes);
        const BigInt result = left + random_big_int_delta;
 
        if(result >= left && result <= right)
        {
            return result;
        }
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.11.2023, 09:17
Ответы с готовыми решениями:

Генерация случайных чисел в заданном диапазоне.
Здесь сказано Почему?

Генерация случайных чисел на заданном диапазоне
Здравствуйте, прошу прощения, если такая тема уже проскакивала. Есть простой генератор чисел (алгоритм Леммера): #include...

Рандом: генерация случайных чисел в заданном диапазоне
Вобщем такая задача: пользователь должен вводить верхнюю границу диапазона случайных чисел (например, 56) и нижнюю (например, -35). Как...

11
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
21.11.2023, 09:35
SomniPhobia, https://en.cppreference.com/w/cpp/numeric/random
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,296
21.11.2023, 10:19
Лучший ответ Сообщение было отмечено SomniPhobia как решение

Решение

Цитата Сообщение от SomniPhobia Посмотреть сообщение
Как генерировать числа от a до b без пробы, ровно по границам?
Так а кто вам мешает применить обычный метод? a + rand() % (b - a + 1). BigInt со всеми операциями у вас уже есть, нужно только сделать rand().
1
21.11.2023, 10:30

Не по теме:

С помощью чего эта картинка нарисована?

0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407
21.11.2023, 12:05  [ТС]
nmcf,

Не по теме:


С помощью моих рук
С помощью графического планшета и пера
В Windows с помощью Windows Ink Workspace, в трее у часов иконка с ручкой у меня
Внутри Windows Ink Workspace приложение Доска
Открывается программа Microsoft Whiteboard
В ней можно создавать хоть сколько досок для рисования / письма
Размер каждой доски не ограничен



Добавлено через 3 минуты
TheCalligrapher, хорошая идея
А с какими свойствами числа должен выдавать rand() для BigInt (как правильно настроить)?
Например, rand() должен выдавать числа в 2 раза больше чем right - left
1
736 / 702 / 110
Регистрация: 29.05.2015
Сообщений: 4,293
21.11.2023, 21:16
Цитата Сообщение от SomniPhobia Посмотреть сообщение
Например, rand() должен выдавать числа в 2 раза больше чем right - left
rand() выдаёт числа в диапазоне 0 - 32767. Или в диапазоне 0 - 2147483647. И того и другого более чем достаточно для решения вашей задачи (изображенной на рисунке).

Добавлено через 1 час 8 минут
Если нужны большие числа, то почему бы не генерировать строку случайных десятичных цифр нужной длинны?
1
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407
22.11.2023, 09:28  [ТС]
Цитата Сообщение от alexu_007 Посмотреть сообщение
rand() выдаёт числа в диапазоне 0 - 32767. Или в диапазоне 0 - 2147483647. И того и другого более чем достаточно для решения вашей задачи (изображенной на рисунке)
На рисунке приведён упрошённый пример, чтобы можно было на маленьких числах увидеть то, что я хотел выразить
В действительности, эти числа - ключи, длинной 256, 2048 бит. Это огромные числа. Для чего я использую библиотеку BigInt
В схеме
Code
1
a + rand() % (b - a + 1)
я думаю, до скольки же генерировать числа rand(), ведь BigInt может иметь огромное количество цифр. Я думаю, нужно отталкиваться от длины правой границы

Добавлено через 1 минуту
TheCalligrapher,

Не по теме:


Сколько лет я уже на форуме, но так и не пойму, как вы делаете оформление в ответе, как у Вас у "a + rand() % (b - a + 1)". Подскажите, какими кнопками это делается?



Добавлено через 31 минуту
Сделал метод таким:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
BigInt InSomnia::Rand_Gen::generate_random_bigint(const BigInt &left, const BigInt &right)
{
    if(left == right)
    {
        return left;
    }
    const BigInt delta = right - left;
    const int32_t delta_len_bits = delta.getString(2).length();
    const int32_t delta_len_bytes = delta_len_bits / 8;
    const int32_t rand_len_bytes = delta_len_bytes + 1;
 
    const BigInt rand_value = InSomnia::Rand_Gen::generate_random_bigint(rand_len_bytes);
    const BigInt result = left + rand_value % (delta + 1);
    return result;
}
0
34 / 22 / 13
Регистрация: 20.05.2022
Сообщений: 414
22.11.2023, 13:17
SomniPhobia, а что если воспользоваться генератором из библиотеки GMP?

Добавлено через 9 минут
SomniPhobia, что если взять распределение допустим нормальное на отрезке от 0 до 9. И результат записывать в строку нужно например, нам длина числа 10 символов, запустили генератор 10 раз, получили числа, преобразование строку и сконкатенировали. Потом проверили подходит, ли оно для нашего интервала.
1
Модератор
 Аватар для long399
2885 / 1840 / 933
Регистрация: 16.10.2013
Сообщений: 5,246
Записей в блоге: 15
22.11.2023, 13:18
Цитата Сообщение от SomniPhobia Посмотреть сообщение
Сколько лет я уже на форуме, но так и не пойму, как вы делаете оформление в ответе, как у Вас у "a + rand() % (b - a + 1)". Подскажите, какими кнопками это делается?
заключайте текст в теги INLINE
0
736 / 702 / 110
Регистрация: 29.05.2015
Сообщений: 4,293
22.11.2023, 13:19
Цитата Сообщение от SomniPhobia Посмотреть сообщение
я думаю, до скольки же генерировать числа rand(), ведь BigInt может иметь огромное количество цифр. Я думаю, нужно отталкиваться от длины правой границы
А что, такие ГСЧ для длинной арифметики существуют?
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407
23.11.2023, 12:52  [ТС]
Цитата Сообщение от JIupToH Посмотреть сообщение
SomniPhobia, а что если воспользоваться генератором из библиотеки GMP?
Не пробовал. У меня BigInt работает на mini-GMP, BigInt -> wrapper mini-GMP
Цитата Сообщение от long399 Посмотреть сообщение
заключайте текст в теги INLINE
Спасибо!
Цитата Сообщение от alexu_007 Посмотреть сообщение
А что, такие ГСЧ для длинной арифметики существуют?
Либо запрашиваем случайные числа по API от сервисов, которые специализируются на генерации случайных чисел от шума аппаратуры
Либо с аппаратной части ПК берём энтропию. В Linux /dev/random
Данные представлены как набор байт. Их можно в вихрь, в распределение подать или же использовать в чистом виде, если достаточный объём случайных значений
Так вот, я их воспринимаю как набор байт (unsigned char)
Есть метод, который обеспечивает откалывание нужного числа байт из источника случайности
Эти байты представляем как биты. Кладём в строку. А дальше, эту строку передаём конструктору BigInt, с указанием системы счисления двоичной. BigInt принимает число как набор бит
Можно исходные случайные данные представить в hex строке
Тогда BigInt value (str, 16);
0
736 / 702 / 110
Регистрация: 29.05.2015
Сообщений: 4,293
23.11.2023, 14:01
А чем генераторы псевдослучайных чисел плохи?

Число 2048 бит состоит из 256 шестнадцатеричных цифр. Составьте строку из 256 (псевдо)случайных hex цифр любым самопальным генератором RND - это будет гарантированно уникальная последовательность, которую никто никогда не создавал и не создаст в будущем. Атомов во вселенной меньше, чем вероятность случайно получить такую же последовательность.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.11.2023, 14:01
Помогаю со студенческими работами здесь

Генерация случайных чисел в диапазоне 0 - 1
Привет. Прошу помочь с рандомными числами. Нужны числа от 0 или 1

Генерация случайных вещественных чисел в диапазоне 0..1
Какнить можно заставить rand() работать по аналогии в Паскале, т.е. выдавать числа от 0 до 1 (0,000000054, 0,743325235, 0,0052411 и...

Генерация неповторяющихся чисел в заданном диапазоне
Добрый вечер, прошу помощи в написании скрипта для задания: Компьютер генерирует числа от 1 до 64 командой x=int(rand()%64)+1; ...

Генерация псевдослучайных чисел в заданном диапазоне
Как сделать рандом, который допустим в циклах по типу while выдавал разные значения и имел ограничения (например от 0 до 1 или от 0 до 10)?

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru