Перейти к содержимому

Как выбрать рандомный элемент из массива c

  • автор:

Developing.ru

Выборка случайного элемента из двумерного массива

4 сообщения • Страница 1 из 1
Ini Сообщения: 2 Зарегистрирован: 26 ноя 2010, 07:01

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

Реализую так:

#include #include int main() < int masotr [5]; int dvumas[4][4] = // Определение двумерного массива < , , , >; int i,k,j,v,; printf("Что ищем? 1 – Максимальное и минимальное, 2 – Повторы более одного раза, 3 – Все отрицательные значения, 4 – Случайный элемент"); v = 0; while(v==0) < scanf("%d",&v); printf("\n"); if(v!=1&&v!=2&&v!=3&&v!=4) v=0; >if(v==1) < //Нахождение максимального и минимального элементов int *maxel = &dvumas[0][0]; // Определение указателя на максимальный эл. int *minel = &dvumas[0][0]; // Определение указателя на минимальный эл. for( i = 0 ; i < 4 ; i++ ) < if(dvumas[i][i] >*maxel ) maxel = &dvumas[i][i]; if(dvumas[i][i] < *minel ) minel = &dvumas[i][i]; >; printf("Maximum: %d %c",*maxel,'\n'); printf("Minimum: %d %c",*minel,'\n'); >; if(v==2) < //Нахождение элементов массива, встречающихся более одного раза for (k=0;k<4;k++) for (j=0;j<4;j++) dvumas[masotr[k,j]]++; for(i=0;i<5;i++)cout <; if(v==3) < // Найти все отрицательные элементы в массиве, и заменить их на ноль for (k=0;k<4;k++) for (j=0;j<4;j++)< if (array[ k,j ] >0) < array[ k,j ] = 1; >> >; system("pause"); return 0; > 

Проблема в решении последней задачи. Не знаю как ее начать решать. Как к ней вообще подступиться? С чего начать?

Romeo Сообщения: 3091 Зарегистрирован: 02 мар 2004, 17:25 Откуда: Крым, Севастополь Контактная информация:

Выбор случайного элемента массива

Author24 — интернет-сервис помощи студентам

Поиск случайного элемента заполненного массива
Как найти случайный элемент заполненного числами массива?

Быстрая сортировка с выбором случайного элемента
Вот тут быстрая сортировка с выбором случайного элемента: void quicksort(int from, int to) < .

Запись случайного массива
Здравствуйте,помогите написать отдельно функцию void заполнения массива случайными числами,и как ее.

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

Форумчанин

Эксперт CЭксперт С++

8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453

1 2 3 4 5 6 7 8 9 10 11
#include #include #include int main() { srand( time(0) ); std::string str[4] = {"First", "Second", "Third", "Another" }; std::cout str[rand() % 5]; return 0; }

Регистрация: 13.05.2012
Сообщений: 44
спасибо большое
Регистрация: 23.10.2014
Сообщений: 55

MrGluck, а что на Dev C++ Сделать? выдаёт ошибки:
C:\Users\Alex\Documents\Áåçûìÿííûé1.cpp [Error] ‘srand’ was not declared in this scope
C:\Users\Alex\Documents\Áåçûìÿííûé1.cpp [Error] ‘rand’ was not declared in this scope

67 / 67 / 72
Регистрация: 10.04.2015
Сообщений: 281

ЦитатаСообщение от Алеекс Посмотреть сообщение

MrGluck, а что на Dev C++ Сделать? выдаёт ошибки:
C:\Users\Alex\Documents\Áåçûìÿííûé1.cpp [Error] ‘srand’ was not declared in this scope
C:\Users\Alex\Documents\Áåçûìÿííûé1.cpp [Error] ‘rand’ was not declared in this scope

#include

Эксперт С++

4984 / 3091 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
MrGluck, небольшая поправочка: rand() % 4
Почетный модератор

Эксперт HTML/CSSЭксперт PHP

16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967

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

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Найти элементы массива, со значениями в интервале от 1.5 min элемента до 0.5 max элемента массива
Вывести на экран элементы и индексы элементов, значения которых лежат в пределах хотя бы в 1,5 раза.

Найти сумму первого максимального элемента массива А и последнего минимального элемента массива В
Вот задание : Даны целочисленные массивы А и В. Найти сумму первого максимального элемента массива.

Определить номера минимального элемента массива и элемента, являющегося минимальным без учета этого элемента.
Дан массив. Определить номера минимального элемента массива и элемента, являющегося мини-мальным.

Вывод случайного массива, вылетает программа
Программа генерирует случайный двумерный массив, выводит его в файл, потом читает и выводит на.

Или воспользуйтесь поиском по форуму:

Как выбрать рандомный элемент из массива c

А ещё можно воспользоваться random_shuffle. Правда, если нужны только 10 элементов из 200 это будет слегка оверкилл. С другой стороны, он гарантированно линейный от размера массива (т.е. будет сделано 200 перестановок), а вариант pva, если ничего не путаю имеет сложность O(m*n) в худшем/среднем случае, где n — число требуемых элементов, а m — размер массива.

Ещё такое придумалось:

std::vector array; //считаем, что как-то уже заполнено std::set used; std::list out; for (size_t i = 0; i

Идея сводится к тому, что просто храним список использованных ключей. Если выпадает уже использованный, то перебираем все за ним следующие на предмет нахождения неиспользованного. Худший случай — O(n*n*logn), лучший — O(n*log n). Если n << m, то средний по идее стремится к лучшему.

Но вариант с rand_shuffle всё равно мне нравится больше. Своей краткостью.

upd Поправил заголовок темы. Прошу в будущем давать более содержательные названия.

Последний раз редактировалось ivank, 29-08-2006 в 23:41 .

использование random в массивах С++

Как из массива данных типа char вывести случайные пары элементов, чтобы те не повторялись? Уже сделал работающую программу для вывода этих рандомных пар, но они повторяются. Буду очень благодарен за помощь!

setlocale(LC_ALL, "Rus"); const char* a1[6] = < "ABC","ACB","BCA","BAC","CAB","CBA" >; srand(time(nullptr)); int c = 6; for (int i = 1; i < 7; i++) < cout return 0; 

Отслеживать
задан 5 дек 2019 в 20:48
1 4 4 бронзовых знака

Возьмите просто abс и скормите это в std::next_permutation, не используйте ранд - это не энтропия а просто функция y(t), есть std::mt

5 дек 2019 в 22:00

я начал изучать с++ пару недель назад и не совсем понимаю, как это должно выглядеть, простите, если спрашиваю банальные вещи

5 дек 2019 в 22:05
Что именно Вы хотите сделать, какой вывод вы ожидаете ?
5 дек 2019 в 22:42

Не повторялись пары, элементы в праре или просто элементы? Последнее при требуемом их количестве невозможно 🙂

6 дек 2019 в 4:57
можно создать объект mt19937 (mersenne twister) он более рандомный
– user245150
6 дек 2019 в 12:10

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

#include #include using namespace std; int main() < const char* a1[6] = ; // слова int c = 6, j = 0, r, s, f; int num[60]; // рабочий массив для хранения индексов напечатанных слов for (int i = 0; i < 60; i++) num[i] = 0; setlocale(LC_ALL, "Rus"); random_device rd; // генератор сл.чисел mt19937 gen(rd()); uniform_int_distribution<>dist(0,5); // сл.числа в нормированном диапазоне от 0 до 5 while (j < 60) < r = dist(gen); do < s = dist(gen); >while(s == r); // слова в паре не должны повторяться f = 1; // флажок уникальной пары слов if(j > 0) // если это не первая пара, ищем ее среди напечатанных for (int k = 0; k < j; k += 2) if(r == num[k] && s == num[k+1]) < // если новая пара слов найдена среди напечатанных f = 0; // сбросить флаг уникальной пары break; >if(f == 1) < // если новая пара слов уникальна, сохраним индексы слов в массиве и печатаем num[j] = r; num[j+1] = s; cout > cout 
)" data-controller="se-share-sheet" data-se-share-sheet-title="Поделиться ссылкой на ответ" data-se-share-sheet-subtitle="" data-se-share-sheet-post-type="answer" data-se-share-sheet-social="facebook twitter " data-se-share-sheet-location="2" data-se-share-sheet-license-url="https%3a%2f%2fcreativecommons.org%2flicenses%2fby-sa%2f4.0%2f" data-se-share-sheet-license-name="CC BY-SA 4.0" data-s-popover-placement="bottom-start">Поделиться
)" title="">Улучшить ответ
)">изменён 6 дек 2019 в 11:59
ответ дан 6 дек 2019 в 9:06
8
    это какой-то си стайл решение)
    – Небывалый
    6 дек 2019 в 9:27
    Автор вопроса, как начинающий, исходит пока из известного ему набора понятий. Потому и решение ограничено в средствах. На самом деле, важнее, что вопрос его сформулирован неоднозначно, не в терминах комбинаторики. Например, в случае сочетаний без повторений решение было бы другим.
    – anshap
    6 дек 2019 в 9:44
    Все равно много лишней писанины в Вашем варианте
    – Небывалый
    6 дек 2019 в 9:56
    Спасибо всем за помощь. Я пытался гуглить как включить -std=c++11, понял только то, что куда-то нужно прописать CONFIG += C++11, так и не разобрался куда, надеюсь это не слишком глупый вопрос. На счет моей задачи - мне нужно было вывести случайную пару для 6 элементов, чтобы второй выводимый элемент в строке не повторялся. пример - ABC - ACB; ACB - BCA; BCA - ABC; BAC - CBA; CAB - BAC; CBA - CAB;
    – GeraltLUL
    6 дек 2019 в 17:28
    Мне неизвестна ваша среда программирования, а я использовал Code::Blocks под Win7. И для этого компилятора указанная опция (поддержка стандарта ISO c++11) по умолчанию выключена. Включается через меню Настройки/Compiler/Флаги компилятора (3-я строка). Но в действительности, вместо этого для генерации случайных чисел вы можете пользоваться функциями srand() и rand(), как и ранее. На результат это принципиально не влияет. Тогда и опцию включать незачем.
    – anshap
    6 дек 2019 в 18:12
|Показать ещё 3 комментария
-1

Предлагаю Вам решить задачу таким путем

next_permutation создаст вам набор перечислений без повторений.

Дальше мешайте контейнер и выводи сколько надо уникальных комбинаций

#include #include #include #include #include #include int main() < std::vectorchar_array; std::vector comb; do < comb.push_back(std::accumulate(std::begin(char_array), std::end(char_array), std::string)); > while (std::next_permutation(std::begin(char_array), std::end(char_array))); std::size_t count_print; if (count_print > comb.size()) < throw std::out_of_range (". "); >std::shuffle(std::begin(comb), std::end(comb), std::mt19937_64()>); auto n; auto it; while (n) < std::cout return 0; >

Отслеживать
ответ дан 6 дек 2019 в 9:51
1,562 1 1 золотой знак 7 7 серебряных знаков 11 11 бронзовых знаков

Просто, но если требуется неповторений в паре, а не вообще:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *