Вопрос, существует ли способ получить рандомные значения , к примеру в диапазоне 1-100, с гарантией не повторения? Естественно можно сверять с предыдущими получеными. Может я про rand не все знаю? )))
Вопрос, существует ли способ получить рандомные значения , к примеру в диапазоне 1-100, с гарантией не повторения? Естественно можно сверять с предыдущими получеными. Может я про rand не все знаю? )))
1. Создать массив из 100 элементов.
2. Перемешать.
3. Выбрать последовательно необходимое кол-во элементов без повторений, например, 10.
4. Повторить шаги 2-3 нужное кол-во раз.
ЗЫ: Ты в таких постах лучше сразу указывай все что знаешь, а то так не интересно.
Last edited by Darwin; 12-02-2014 at 11:37.
Есть массив 100 элементов, числа от 1 до 100 , идут по порядку, то есть 1,2,3,4,5 итд. Хочу его перемешать что бы числа шли не по порядку ).
Самый простой вариант.
Code:#include <algorithm> int mas[100] = {1, 2, 3, ... , 100}; random_shuffle(&mas[0], &mas[100]);
Dark Koder (12-02-2014)
Вот мое решение для целочисленного массива:
Code:void shuffle(int *mas, size_t size) { int old_value = 0; size_t r_index = 0; for(size_t index = 0; index < size; index++) { r_index = (rand() % (size - 1)) + 1; if (r_index == index) { r_index++; } old_value = mas[r_index]; mas[r_index] = mas[index]; mas[index] = old_value; } }
Использование массива в данной задаче полезно когда диапозон маленький 100-1000 элементов, если же диапозон большой, то разумнее использовать упорядоенное сбалансированное бинарное дерево, тогда размер дополнительной информации будет соответствовать размеру массива в котором хранились бы уже используемые ключи, + операция проверки существования элемента была бы тоже достаточно быстрой, конечно не O(1) как с массивом, но тем не менее
Если чисел нужно немного, то вполне можно ограничиться китайским подходом:
Code:int rand100() { return rand() % 100; } int a, b, c, d; a = rand100(); do { b = rand100(); } while( b == a ); do { c = rand100(); } while( c == a || c == b ); do { d = rand100(); } while( d == a || d == b || d == c );
ARCHANGEL (10-10-2014) Dark Koder (10-10-2014)