Random в C (Си)
Дан массив:
int *x; x=new int[n]; Я его заполняю рандомно: Код:
srand(time(NULL)); Я пробовал так: Код:
for (int i=0; i<n; i++) Как добится того, чтобы элементы массива были уникальны и при этом время выполнения было как можно минимально. |
Решил проблему так:
Код:
#include <stdio.h> |
А если использовать цикл do\while? Тоесть пока не будет соблюдено условие (все элементы не проверены) или один из них равен сгернерированному раньше, продолжать генерацию чисел до тех пор пока не будет найденно число, которого нет в массиве.
Код:
do{ |
Цитата:
|
я советую алгоритм хитрее: Сгенерировать последовательность чисел, которые должны быть, а потом перемешать их в случайном порядке. Перемешивание делать выбором случайного индекса из последовательности и удалять из списка число, соответсвующее индексу. Либо перетусовать их любым другим способом.
Код:
int values[200]; |
pva, Вот вывод твоего кода:
1134459160191733723168103531901711854108105291224071587942115869261551291771481125010676133331255147 1531215789147186529713019216191341595894612145856519411114511715181997231273188110146139123391691821 0414229026931326678845613671474189223212418415195131128127551701018517568916410117917313725165176196 1201408218062957012610719336301501521987582019787014696316311618399968316611412128171888149172463515 115410264981621491311960135576713819178241877710980111003848431741671411431615614413418141 Повторяющиеся числа есть, а если нету, то не понятно почему. Цитата:
P.S Еще вариант Код:
1: #include<conio.h> |
Цитата:
Цитата:
(т.е если size=10, то значения x[0], x[1]...x[size] будит пренадлежать интервалу [0, size]). В случае если мне понадобится массив из 10 элементов со зна4ениями на интервале [100, 200] этот вариант я так понимаю не подойдёт? |
Надо создать два алгоритма:
для случая когда размерность массива и интервала допустимых значений примерно равны - перетасовать массив и когда интервал допустимых значений гораздо больше размерности массива - просто рандомно заполнять, проверяя - нет ли уже таких значений в массиве. Чтобы проверка работала быстрее - создать два массива - один итоговый, второй - своеобразный индекс - где полученные рандомные значения хранятся в порядке возрастания. Т.к. поис по упорядоченному множеству проходит гораздо быстрее. |
Цитата:
Сорри, будит зависеть. |
Цитата:
а масштаб рандомизации я выбрал 200 (т.е рандом будит возврощать значения от 0 до 200 (0<=rand<=200)) Код:
for(unsigned n=0; n<50; ) то мы начинаем проверять с несуществующем элементом массива if( values[ rand_idx ]==-1 ) values[ rand_idx ] = n++;, т.е тут n не увеличится на еденицу. И следовательно n будит увеличиватся только тогда, когда rand выберит число находящееся на интервале [0, до размерности массива]. Следовательно n увеличится ровно столько раз сколько будит равна размерность массива. И поэтому значение элементов массива не будит превосхадить размерности массива. |
Цитата:
Тогда такой вариант: Код:
1: #include<conio.h> |
Извияюсь, что в прошлом примере не поставил разделитель при выводе на экран, чем сбил столку. Иногда не проверяю код :-[
Для случая когда диапазон гораздо больше последовательности, которую надо выдать, предлагаю очередной "хитрый" способ: Код:
// Опять же предполагаю, что число возможных комбинаций не меньше числа требуемых |
|
Время: 18:50. |
Время: 18:50.
© OSzone.net 2001-