LINUX.ORG.RU
Если тебя волнует промежуток на котором будут эти числа, то смело суммируй. 
Пример:
цикл
  sum = рандом()
  н_i += sum
конец цикла 
Ну а рандом от 0 до 1, поэтому все чиcла разные будут. 
iriyoox
()
Построить список уникальных чисел нужного размера, потом по случайному индексу выдёргивать их оттуда, уменьшая диапазон для следующего индекса на 1.
vsemnazlo
()
Можно с затратами памяти: 

Строишь массив 1,2,3 ... RND_MAX. Перемешиваешь его 
за RND_MAX шагов по следующему алгоритму:  на i-ом шаге цикла от 1 до RND_MAX выбираешь случайный элемент между i-ым и последним массива и меняешь его значения (swap) с i-ым. 

Если N < RND_MAX, то перемешать можно только первые N элементов. 

Пример 
1 2 3 4 5 6 7 8 9
3 2 1 4 5 6 7 8 9
3 7 1 4 5 6 2 8 9
3 7 6 4 5 1 2 8 9 
..... 
bizanine
()
Ответ на: комментарий от vsemnazlo
>Построить список уникальных чисел нужного размера, потом по случайному индексу выдёргивать их оттуда, уменьшая диапазон для следующего индекса на 1.

А как можно сделать список, в котором и операция удаления, и операция обращения по индексу занимает константное время?

anonymous
()
Ответ на: комментарий от anonymous
>А как можно сделать список, в котором и операция удаления, и операция обращения по индексу занимает константное время?

Поправка: не список, а множество (порядок не важен). Это то, что описал bizanine.

vsemnazlo
()
Ответ на: комментарий от bizanine
>Можно с затратами памяти:

Потому реально только для целых чисел небольшого диапазона.

anonymous
()
Ответ на: комментарий от anonymous
Создаёшь массив, выбираешь несколько случайных чисел и пропускаешь через функцию, которая будет на основе них делать уникальные числа. Ещё лучше на основе одного числа, чтобы гарантировать неповторимость.
Quasar ★★★★★
()
Ответ на: комментарий от Quasar
Кстати функцию можно сделать так, чтобы следующее число генерировалось на основе предыдущего, либо чтобы функция выдавала заданное количество таких уникальных чисел. Причём дважды случайность можно использовать:

1. Генерация базового числе 2. Генерация случайного числа, на основе которого будет делаться преобразование + перебор цикла для получения уникальности, скажем для уникального множителя или другого параметра.

Quasar ★★★★★
()
Ответ на: комментарий от iriyoox
> Если тебя волнует промежуток на котором будут эти числа, то смело суммируй.

Тогда это будет возрастающая последовательность. А это в данном случае плохо.

Sikon ★★★
() автор топика
Ответ на: комментарий от Sikon
То есть, собственно, задача такая: из множества 1..n выбрать m различных чисел (m < n) и расположить в случайной последовательности.

n варьируется, m можно считать фиксированным.

Sikon ★★★
() автор топика
Ответ на: комментарий от Sikon
> То есть, собственно, задача такая: из множества 1..n выбрать m различных чисел (m < n) и расположить в случайной последовательности.

Отлично, алгоритм в моём посте подходит :)

В примере тогда считай n = 9 и m = 3. Первые 3 числа в последней строчке -- ответ. Сложность = n + m, затраты памяти = n.

bizanine
()
Массив из 2 столбцов. Первый столбец - номер строки, второй - случайное число с плавающей точкой между 0 и 1. Сортируешь массив по второму столцу.
Sun-ch
()
Ответ на: комментарий от Sun-ch
Можно решить за o(N). Если взять правильный генератор ПСЧ с длиной последовательности на много порядков превышающей размерность массива. Про генераторы ПСЧ читать у Кнута.
anonymous
()
Ответ на: комментарий от anonymous
# быстрое заполнение массива случайными числами 0..size-1
void fill_array(int *arr,int size) {
  int pos,npos;
  memset(arr,-1,size);
  for(pos=0;pos<size-1;) {
     npos=1+pos+(random()%(size-pos-1));// случайное число pos+1..size-1
     if ( arr[npos]==-1 ) {
         arr[npos]=pos;
     } else if (arr[pos]==-1) {
         arr[pos]=arr[npos];
         arr[npos]=pos;
     } else {
         swap(arr,pos,npos); // поменять местами два элемента
         continue;
     }
     pos++;
  }
}
# не тестилось :) 
MKuznetsov ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.