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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.