Root /ArchiveAbout
()

Неповторяющиеся случайные числа на промежутке

Неповторяющиеся случайные числа на промежутке

Иногда возникает необходимость в нахождении последовательности целых случайных чисел, находящихся в некотором указанном диапазоне. Следующий код, написанный на Паскале, как раз решает эту задачу — генерирует случайные числа на промежутке [a,b]. Можете скопировать целиком и программа будет работать.

var
  M: array[0..10000] of integer;
  i, j, p: word;
  a, b, c: integer;
  f: boolean;
begin
  write('В каком интервале [a, b] вы хотите', 
   ' получить набор случайных чисел?');
  writeln('Введите целые числа a и b через пробел:');
  readln(a, b);
  write('Сколько случайных чисел хотите получить',
   ' в промежутке [', a, ', ', b, ']?');
  write('p = ');
  readln(p);
 {Количество чисел в диапазоне[a, b] равно b - a + 1.
 Поэтому, если ввести p больше этого числа, то будет
 ошибка. Условие while ниже это проверяет:}
  while p > b - a + 1 do
   begin
     writeln(' Введите p не больше, чем ', b - a + 1, '!');
     write('  p = ');
     readln(p);
     if p > b - a + 1 then write(' Неверно!')
   end;
  writeln;
  write(' Набор из ', p, ' случайных чисел в');
  writeln(' диапазоне ', '[', a, ', ', b, ']:');
  randomize;//Генератор псеослучайных чисел.
 {Находим первое случайное число (с индексом 0):}
  m[0] := a + random(b - a + 1);
  write('  ', m[0]);
  for i := 1 to p - 1 do
   begin
    {Находим (i + 1)-е случайное число (с индексом i):}
     m[i] := a + random(b - a + 1);
     repeat
      {Индикатор уникальности чисел
      (все предыдущие числа разные):}
       f := true;
      {Проверяем предыдущие числа на уникальность:}
       for j := 0 to i - 1 do
      {Если число m[i] совпадает с одним из предыдущих:}
         if m[i] = m[j] then
          begin
          {то меняем индикатор на
           противоположный (числа совпали!):}
            f := false;
           {и пробуем другое случайное число:}
            m[i] := a + random(b - a + 1)
          end
    {И так до тех пор пока индикатор не изменится:}
     until f = true;
    {В таком случае выводим новое случайное число:}
     write('  ', m[i])
   end;

 {Если откроем фигурные скобки ниже, то получим те
 же числа, но в порядке возрастания (случайный набор
 возрастающих целых чисел в вышеуказанном диапазоне):}

{
  writeln;
  writeln;
  writeln(' Тот же набор чисел, но в порядке возрастания:');
  for i := 0 to p - 1 do
   begin
     for j := i + 1 to p - 1 do
      begin
        if m[i] > m[j] then
         begin
           c := m[i];
           m[i] := m[j];
           m[j] := c
         end
      end;
     write('  ', m[i])
   end
 }
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** boolean;: Представляет логическое значение.

  1. **procedure** Randomize;: Инициализирует датчик псевдослучайных чисел.2) **procedure** Randomize(seed: integer);: Инициализирует датчик псевдослучайных чисел, используя значение seed. При одном и том же seed генерируются одинаковые псевдослучайные последовательности.
  2. **function** Random(maxValue: integer): integer;: Возвращает случайное целое в диапазоне от 0 до maxValue - 1.2) **function** Random(a,b: integer): integer;: Возвращает случайное целое в диапазоне от a до b.3) **function** Random: real;: Возвращает случайное вещественное в диапазоне [0..1).
  3. **function** Random(maxValue: integer): integer;: Возвращает случайное целое в диапазоне от 0 до maxValue - 1.2) **function** Random(a,b: integer): integer;: Возвращает случайное целое в диапазоне от a до b.3) **function** Random: real;: Возвращает случайное вещественное в диапазоне [0..1). **const** true = True;: Представляет логическое значение. **const** false = False;: Представляет логическое значение.
  4. **function** Random(maxValue: integer): integer;: Возвращает случайное целое в диапазоне от 0 до maxValue - 1.2) **function** Random(a,b: integer): integer;: Возвращает случайное целое в диапазоне от a до b.3) **function** Random: real;: Возвращает случайное вещественное в диапазоне [0..1). **const** true = True;: Представляет логическое значение. * * *

Перемешивание целых чисел от a до b в случайном порядке

А от если хотите в случайной последовательности перемешать все числа с диапазона [a,b], то в предыдущий код вам надо поставить p = b - a + 1, поскольку количество целых чисел в промежутке [a,b] равно b - a + 1 и при нахождении случайных чисел ни одно целое число не будет пропущено. Подобная задача может возникнуть, если надо данный список людей перемешать и составить новый.

var
  M: array[0..10000] of integer;
  i, j, p: word;
  a, b: integer;
  f: boolean;
begin
  writeln('В каком интервале [a, b] вы хотите перемешать числа?');
  writeln('Введите целые числа a и b:');
  readln(a, b);
  p := b - a + 1; //Количество целых чисел в диапазоне [a, b]
  writeln;
  write(' Перемешанные в случайном порядке числа');
  writeln(' в диапазоне ', '[', a, ', ', b, ']:');
  writeln;
  randomize; //Генератор псевдослучайных чисел.
 {Находим первое случайное число (с индексом 0):}
  m[0] := a + random(b - a + 1);
  write(' ', m[0]);
  for i := 1 to p - 1 do
   begin
    {Находим (i + 1)-е случайное число (с индексом i):}
     m[i] := a + random(b - a + 1);
     repeat
      {Индикатор уникальности чисел
      (все предыдущие числа разные):}
       f := true;
      {Проверяем предыдущие
      числа на уникальность:}
       for j := 0 to i - 1 do
        {Если число m[i] совпадает
         с одним из предыдущих:}
         if m[i] = m[j] then
          begin
           {то меняем индикатор на
            противоположный (числа совпали!):}
            f := false;
           {и пробуем другое случайное число:}  
            m[i] := a + random(b - a + 1)
          end
    {И так до тех пор пока индикатор не изменится:}      
     until f = true;
    {В таком случае выводим новое случайное число:}
     write(' ', m[i])
   end;
  readln
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** boolean;: Представляет логическое значение.

  1. **procedure** Randomize;: Инициализирует датчик псевдослучайных чисел.2) **procedure** Randomize(seed: integer);: Инициализирует датчик псевдослучайных чисел, используя значение seed. При одном и том же seed генерируются одинаковые псевдослучайные последовательности.
  2. **function** Random(maxValue: integer): integer;: Возвращает случайное целое в диапазоне от 0 до maxValue - 1.2) **function** Random(a,b: integer): integer;: Возвращает случайное целое в диапазоне от a до b.3) **function** Random: real;: Возвращает случайное вещественное в диапазоне [0..1).
  3. **function** Random(maxValue: integer): integer;: Возвращает случайное целое в диапазоне от 0 до maxValue - 1.2) **function** Random(a,b: integer): integer;: Возвращает случайное целое в диапазоне от a до b.3) **function** Random: real;: Возвращает случайное вещественное в диапазоне [0..1). **const** true = True;: Представляет логическое значение. **const** false = False;: Представляет логическое значение.
  4. **function** Random(maxValue: integer): integer;: Возвращает случайное целое в диапазоне от 0 до maxValue - 1.2) **function** Random(a,b: integer): integer;: Возвращает случайное целое в диапазоне от a до b.3) **function** Random: real;: Возвращает случайное вещественное в диапазоне [0..1). **const** true = True;: Представляет логическое значение.