ВВЕРХ
ВНИЗ
  • Home
  • Array
  • Случайные числа

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

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

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
67  
68  
69  
70  
71  
72  
73  
74  
75  
76  
77  
78  
79  
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.

*   *   *

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

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

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
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.


Яндекс.Метрика