Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978

Любопытная задачка. Случайное заполнение массива

16.01.2020, 21:51. Показов 1269. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот из этой темы, там где куча разной простой ерунды
Не могу сделать задания
свалилась любопытная задачка
Заполнить массив из K элементов случайными возрастающими значениями из диапазона от M до N (N-M>=K).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.01.2020, 21:51
Ответы с готовыми решениями:

Случайное число в диапозоне и заполнение массива.
Добрый день. Может ктонить помоч с кодом на С++? Задание звучит так: Написать функцию которая принимает 2 аргумента целых числел. Функция...

Любопытная задачка
Вот в разделе программирования возникла любопытная задачка. https://www.cyberforum.ru/cpp-beginners/thread1657745.html#post8727109 ...

Рембо и Верещагин (любопытная задачка)
https://www.cyberforum.ru/cpp-beginners/thread2038687.html#post10746974 Имхо, задача попала явно не в тот раздел. Может быть у кого-то...

7
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
16.01.2020, 22:00
Байт, а чего тут интересного? Заполнить массив случайными значениями из диапазона, а потом отсортировать по возрастанию.

Или я чего-то не втыкаю?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
16.01.2020, 22:11  [ТС]
Цитата Сообщение от L0M Посмотреть сообщение
Или я чего-то не втыкаю?
Дык, они ж повторятся будут. Вы, конечно, предложите проверять на "уже было". Но это неважное решения. Оно может привести к потенциально бесконечному времени. А хочется, чтобы время генерации такой последовательности не зависело от случайностей.
И кроме того, нужно чтобы все возможные варианты были равно-вероятны.
Упростим (не намного) задачу. Числа от 1 до N. Последовательность длины K. N >= K. Упрощение очевидное, и ни от чего не спасающее. Просто, чтоб писать было меньше.
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
16.01.2020, 22:17
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 <vector>
#include <ctime>
#include <algorithm>
using namespace std;
 
 
int main() 
{
    srand(time(nullptr));
    int m = 20, n = 40, k = 10, index;
    int *a = new int[k];
    vector<int> vec;
    for (int i = m; i <= n; i++)
        vec.push_back(i);
    for (int i = 0; i < k; i++)
    {
        index = rand() % vec.size();
        a[i] = vec[index];
        vec.erase(vec.begin() + index);
    }
    sort(a, a + k);
    for (int i = 0; i < k; i++)
        cout << a[i] << " ";
    return 0;
}
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
16.01.2020, 22:31
Не равномерно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <random>
 
int main()
{
    std::mt19937 gen;
    size_t K = 10;
    int M = 0;
    int N = 10;
    for (size_t i = 0; i < K; ++i) {
        std::uniform_int_distribution<int> dist(M, N - (K - i));
        M = dist(gen);
        std::cout << M << std::endl;
        ++M;
    }
}
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
16.01.2020, 22:55  [ТС]
Даценд, Да, похоже на правду. Вместо генерации самих чисел генерируется индексы.
Какие тут могут быть возражения.
а) при больших интервалах n-m вектор жрет очень много памяти.
б) операция erase (удаление элемента) для вектора весьма дорога. Список? Тогда дорога операция [index].
У меня была идея - генерировать интервалы. Но тогда по времени беда. Надо делать N-M-K рандомов.
Вот тут некоторые соображения на эту тему
Случайные неповторяющиеся
Как раз для данной задачи никакого тасования не нужно.
Но это старинная дилема: "память - время"

Добавлено через 7 минут
Croessmah, чтобы не ломать психику, расскажи в двух словах, что такое
std::mt19937 gen;
std::uniform_int_distribution<int> dist(M, N - (K - i));
dist
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
16.01.2020, 23:10
Цитата Сообщение от Байт Посмотреть сообщение
std::mt19937 gen;
Генератор случайных чисел. Вихрь Мерсенна.
Цитата Сообщение от Байт Посмотреть сообщение
std::uniform_int_distribution<int> dist(M, N - (K - i));
Равномерное распределение от M до N - (K - i)
Цитата Сообщение от Байт Посмотреть сообщение
dist(gen)
Генерация числа в заданном промежутке.

Можно написать с rand.

Равномернее:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
#include <random>
#include <chrono>
 
int main()
{
    std::mt19937 gen(std::chrono::system_clock::now().time_since_epoch().count());
    size_t K = 10;
    int M = 0;
    int N = 10;
    int unistep = (N - M) / K - 1;
    for (size_t i = 0; i < K; ++i) {
        std::uniform_int_distribution<int> dist(M, M + unistep);
        std::cout << dist(gen) << std::endl;
        M += unistep + 1;
    }
}
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.01.2020, 05:55
Цитата Сообщение от Байт Посмотреть сообщение
Числа от 1 до N. Последовательность длины K. N >= K.
ЗЫ какие вектора-списки-мапы? Исключая приседания для приготовления обычного [0; 1) рандома, весь алгоритм - одна строчка, O(n) по времени, O(1) по памяти.
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <random>
 
int main() {
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_real_distribution<> dis(0.0, 1.0);
    int n, k; std::cin >> n >> k;
    for (int i=1; i<=n; i++) if (dis(gen) < k/(n-i+1.0)) { std::cout << i << '\n'; k--; }
}
ЗЗЫ для ценителей расскажу словами еще один алгоритм (реализовывать лень). Отрезок [1;n] разбиваем пополам, и решаем задачу рекурсивно, разделяя K на две НЕРАВНЫЕ (очевидно, т.к. при равных будет эмуляция равномерной сетки, заполняющей интервал [1;n] с равномерным шагом) части по БИНОМИАЛЬНОМУ РАСПРЕДЕЛЕНИЮ (отлично аппроксимируется обычным Гауссом), далее каждую половину интервала так же разбиваем пополам с разделением части K этой половины интервала аналогично и т.д. Когда дошли до K=N берем все точки интервала, когда K=0 прекращаем безобразие и ничего не берем из этого интервала. Если вдруг кому-то интересно, нафига такие сложности - алгоритм выше имеет временнУю сложность O(n), а описанный O(k). Если k сравнимо с n, то проще не морочиться и взять однострочник выше. Если n велико, а k относительно мало - то описанный алгоритм.

ЗЗЗЫ первый алгоритм используется вот здесь
https://github.com/Ivana-/star-dance (исходник)
https://codepen.io/Ivana-/full/BMxJPp (онлайн-демка)
в проекте визуализации графов для генерации случайных графов по заданному количеству вершин и ребер.

Пользуясь случаем, выражаю признательность за помощь хаскель-чатику в телеграме и форуму dxdy.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.01.2020, 05:55
Помогаю со студенческими работами здесь

Случайное заполнение массива 4х4 заранее определенными строками
Есть 16 строк. Надо заполнить ими массив 4х4 случайным образом

Случайное заполнение БД
Здравствуйте форумчане, имеется база данных, нужно внести туда 10000 записей для проверки на стабильность. Как это организовать в access'е?

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

Случайное заполнение Drawgrid
Создаю игру &quot;Найди пару&quot; и когда создал drawgrid задался вопросом как его заполнить картинками(с условие что при каждом нажатие на кнопку...

случайное заполнение чисел
как в програме заполнить родномно вектор Y program var5; uses crt; var x,y: array of real;temp: real;i: integer; begin ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru