Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2010, 20:15   #1
*stRong*
Пользователь
 
Регистрация: 25.01.2009
Сообщений: 47
По умолчанию Pascal. Случайные числа.

Мне нужно сделать вывод N случайных чисел из заданного диапазона. Но проблема в том, что нужно, чтобы числа НЕ ПОВТОРЯЛИСЬ. Поэтому обычный random не катит...
Подскажите, каким образом это можно реализовать случайные неповторяющиеся числа?
*stRong* вне форума Ответить с цитированием
Старый 05.07.2010, 20:35   #2
Chudo4258
Форумчанин
 
Аватар для Chudo4258
 
Регистрация: 19.02.2009
Сообщений: 622
По умолчанию

ну дак храни где-то уже сгенерированные числа, и сверяй с новым числом.
Жми на весы!!!
Chudo4258 вне форума Ответить с цитированием
Старый 05.07.2010, 21:00   #3
fbus
Форумчанин
 
Аватар для fbus
 
Регистрация: 23.10.2008
Сообщений: 460
По умолчанию

пиши мне в аську, я тебе сделаю
fbus вне форума Ответить с цитированием
Старый 05.07.2010, 21:21   #4
*stRong*
Пользователь
 
Регистрация: 25.01.2009
Сообщений: 47
По умолчанию

fbus, спасибо. Но делать мне ничего не нужно, т.к. это не учебное задание, а просто пишу ради интереса, следовательно, хочу сам сделать
Просто мне нужен совет, каким образом это сделать...
Может это через массивы сделать? Т.е. есть 2 массива, в первый заносится число, сравнивается с числами второго массива, если такого числа нет, то заносим его во второй массив?
*stRong* вне форума Ответить с цитированием
Старый 05.07.2010, 21:24   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

достаточно одного массива размерностью N
получайте случайное число до тех пор, пока оно поиском находится. Поиск - это просто перебором искать в этом же массиве - цикл от 1 до I-1 (i- текущий - получаемый элемент массива)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.07.2010, 23:40   #6
fbus
Форумчанин
 
Аватар для fbus
 
Регистрация: 23.10.2008
Сообщений: 460
По умолчанию

не обязательно заводить массив. все равно все числа хранятся например в строке
поэтому
Код:
for i:=1 to length(s) do
if s = s[i] then....
ну и так далее
fbus вне форума Ответить с цитированием
Старый 06.07.2010, 00:23   #7
kogemrka
Форумчанин
 
Аватар для kogemrka
 
Регистрация: 08.01.2010
Сообщений: 165
По умолчанию

сохраняем числа, которые выводим, и выводя каждое следующее число, проверяем, не выводили ли мы его ранее. Выглядит это примерно так:

Код:
program rnd1;
var
   m : array[1..100] of integer;
   i, j, num : integer;
   Flag : Boolean;
begin
     randomize;

     {Заполняем массив числами от одного до 100}
     for i := 1 to 100 do
     begin
          Flag := True;

          while Flag do
          begin
               num := Random(100) + 1;
               Flag := False;
               for j := 1 to i - 1 do
                    if m[j] = num then
                    begin
                         Flag := True;
                         break;
                    end;
          end;

          m[i] := num;
     end;

     {Выводим содержимое массива}
     for i := 1 to 100 do
         write(m[i], ' ');

     ReadLn;
end.
kogemrka вне форума Ответить с цитированием
Старый 06.07.2010, 08:55   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от fbus
не обязательно заводить массив. все равно все числа хранятся например в строке
строка - это массив из символов.
Это во-первых. Во-вторых, а кто Вам сказал, что числа однозначные? Бывают и двух и трёх и даже больше! Значит надо придумывать, как их разделять, писать код по выделению очередного числа и т.д. и т.п. Это, конечно же, можно всё сделать... вопрос - ЗАЧЕМ?!
Цитата:
Сообщение от fbus
Код:
if s = s[i] then....
ну, это вообще шедевр! (понимаю, что Вы просто описались и вместо S должна быть переменная с очередной цифрой....)
Но вообще — это дорога в никуда...



kogemrka, в целом - однозначно зачёт.
Просто хочу отметить. Если задача стоит так:
Цитата:
... array[1..100] of integer;
... Random(100) + 1; (случайные числа от 1 до 100 )
Т.е. 100 чисел случайном образом разместить в массиве.
Тогда можно использовать такой алгоритм: заполняется массив от 1 до 100, (for i:=1 to 100 do a[i] := i
а потом случайным образом перемешивается... код получается достаточно простым:
Код:
  for i:=1 to 100 do begin
    repeat 
       K := Random(100) + 1;
    until K<>i;
    tmp := a[k];
    a[k] := a[i];
    a[i] := tmp;
  end;
и всё.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.07.2010, 10:08   #9
VektorAB
Пользователь
 
Регистрация: 13.05.2010
Сообщений: 29
По умолчанию

Создавай множество и сверяй вхождение в него гененинуемого числа, если оно отсутсвует в нем то делай что хочешь с ним, но добавь его в множество, иначе опять генерируй.
Множество - M:set of [1..100];
Генерация:
Код:
{начальные присвоения.}
for i:=1 to 10 do
    begin
           repeat
                 n:=random (100)+1 
           until not(n in M);
           M:=M+[n];
           Write(n)
     end;
Вывод 10-ти случайных неповторяющихся чисел.

На мой взгляд самый простой способ.

P.S.
FBus рассмешил. Числа в твоем случае могут быть только однозначными,т.е цифрами.
Ну и соглашусь с Serge_Bliznykov строка это массив символов {stroka:array[1..255] of char;}
"Сегодня, в завтрашний день не все могут смотреть, вернее не только лишь все, мало кто может это сделать"

Последний раз редактировалось VektorAB; 06.07.2010 в 10:23.
VektorAB вне форума Ответить с цитированием
Старый 06.07.2010, 10:25   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
Мне нужно сделать вывод N случайных чисел из заданного диапазона. Но проблема в том, что нужно, чтобы числа НЕ ПОВТОРЯЛИСЬ.
использовать принцип колоды карт

0. берем массив длины M (длина диапазона чисел)
1. заполняем массив возможными значениями (числами по порядку без повторений)
с помощью Random ТАСУЕМ наш массив напримет так
Код:
for j:=1 ro x do
n1:=random(m);
n2:=random(m);
r:=mas[n1]; mas[n1:=mas[n2]; mas[n2:=r;
3. используем первые N значений.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Случайные числа Toa Microsoft Office Excel 6 30.11.2013 18:45
Случайные числа severin Помощь студентам 8 02.02.2010 17:35
Случайные числа.... Teen4jump Общие вопросы Delphi 4 28.11.2008 23:52
Delphi - Случайные числа Albenous Помощь студентам 2 28.12.2007 22:34