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

Как выбрать рандомный элемент из массива 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 Откуда: Крым, Севастополь Контактная информация:

Как выбрать случайный элемент из массива js

Чтобы выбрать случайный элемент из массива можно воспользоваться методами Math.random() и Math.floor() :

20 октября 2022

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

const movies = [ 'Star Wars', 'Pirates of the Caribbean', 'Lord of the Rings', 'Avengers', 'The Dark Fields', ]; //выбираем фильм на вечер с помощью метода _.sample() const random = _.sample(movies); console.log("Random:", random); // => Random: Pirates of the caribbean 

Познакомились с методом _.sample() и выбрали фильм на вечер.

Документация:
  • _.sample()

использование 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 бронзовых знаков

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

Как выбрать рандомный элемент из массива 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 .

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

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