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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2011, 02:29   #1
Костян Пират
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 103
Сообщение Генератор случайных чисел

В программе необходимо реализовать генератор случайных чисел. 4хзначное число, причем в нем не должно быть одинаковых цифр

Код:
 a[1]:=Random(10);
 randomize;
 for i:=2 to 4 do
  repeat
   a[i]:=Random(10);
   randomize;
  until a[i]<>a[i-1];
в массиве лежат отдельные цифры. Получается при многократной генерации примерно такая штука: 0821, 0829, 6529, 0529... то есть две попытки подряд дают почти одинаковые числа... можно ли как-то сделать, чтобы разброс чисел был более сильным?
Костян Пират вне форума Ответить с цитированием
Старый 23.01.2011, 03:14   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

может проще использовать random(10000)?

пример:
var s:string;
begin
s:=IntToStr(random(10000));
while Length(s)<4 do s:='0'+s;
end;

в начале программы(в FormCreate) не забудьте вставить Randomize.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.01.2011, 09:44   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Пепел Феникса, Ваш код не решает поставленную задачу:
Цитата:
в нем не должно быть одинаковых цифр
Костян Пират, вообще-то, через поиск легко найти на форуме похожие темы, такие задачи уже решались.

В вашем коде главная "дырка" - вы получаете очередную цифру, отличную от предыдущей, а надо, чтобы она отличалась от ВСЕХ найденных ранее чисел.
(ну и randomize надо делать ДО обращения к функции random!!
И randomize должно вызываться только один раз!)

попробуй такой код:
Код:
var 
 a: array[1..4] of integer;
 i, j : integer;
 flWasBefore  : boolean; 

begin
 randomize;
 a[1]:=Random(10);
 for i:=2 to 4 do 
 begin
  repeat
   flWasBefore := false;
   a[i]:=Random(10);
   for j:=1 to (i-1) do
     if a[j] = a[i] then flWasBefore := true;
  until not flWasBefore;
 end;
...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.01.2011, 10:03   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

вот ещё вариант, с одним циклом )

Код:
function randgen(n: integer): string;
var
  s: string;
  i, j: integer;
begin
  Randomize();  // setup random sequence
  //
  // see if we got proper n
  // if not, adjust to something sane
  if (10 < n) then
    n := 10;
  if (1 > n) then
    n := 1;
  //
  // setup strings
  s := '0123456789';
  SetLength(result, n);
  //
  // loop through digits
  for i := 1 to n do begin
    //
    j := 1 + random(length(s));  // select another random position in s
    result[i] := s[j];  // add to result
    //
    // remove from source string, so this digit will not appear again
    Delete(s, j, 1);
  end;
end;
Цитата:
И randomize должно вызываться только один раз!
а почему?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 23.01.2011 в 10:11. Причина: расширил до универсального генератора с числом цифр от 1 до 10 )
veniside вне форума Ответить с цитированием
Старый 23.01.2011, 10:27   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
а почему?
а зачем тысячу раз инициализировать счетчик случайных чисел?(этого достаточно один раз)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.01.2011, 10:34   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

кстати, строго говоря, согласно условию задачи, первой цифрой ноль идти НЕ МОЖЕТ. число 0123 - не 4-х значное!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.01.2011, 18:51   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а зачем тысячу раз инициализировать счетчик случайных чисел?(этого достаточно один раз)
Чтобы повысить степень непредсказуемости )

Цитата:
кстати, строго говоря, согласно условию задачи, первой цифрой ноль идти НЕ МОЖЕТ. число 0123 - не 4-х значное!
Тогда в конце добавить проверочку:

Код:
  if ('0' = result[1]) then begin
    if (2 > n) then
      result := IntToStr(1 + random(9))
    else begin
      result [1] := result[2];
      result[2] := '0';
    end;
  end;
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 23.01.2011, 21:58   #8
Костян Пират
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 103
По умолчанию

спасибо, я ступил по поводу различных цифр... он сравнивает только с предыдущей цифрой у меня)) спать надо ночью, а днем заниматься решением задач))
по поводу 4хзначного числа - 0 можно на первое место) это не совсем число, скажем, в обычном понимании))
извиняюсь за неточную формулировку, рассмотрю предложенные варианты)

СПАСИБО ВСЕМ!)))
Костян Пират вне форума Ответить с цитированием
Старый 23.01.2011, 22:08   #9
Костян Пират
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 103
По умолчанию

veniside, отдельное спасибо, мне нравится это решение
Костян Пират вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Генератор случайных чисел Evgenii(Евгений) Помощь студентам 6 23.01.2011 22:41
Генератор случайных чисел Creativety Фриланс 10 27.12.2010 12:33
C++ генератор случайных чисел sir.andrey Помощь студентам 4 03.09.2010 12:22
генератор случайных чисел на С++ ANTI Общие вопросы C/C++ 20 12.04.2009 13:02
Генератор случайных чисел psychopat Общие вопросы Delphi 11 18.02.2009 10:39