Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Сгенерить строку из случайных символов


Автор: Gershkovich 26.1.2007, 17:26
Всем привет !

Мне нужно сгенерить пароль - строку из случайных символов (можно не печатных типо  #0)

На ум приходит тока такое:

Код

s : string 
while true do
  s:= s + Char(Random(256));


Есть ли более элегантный способ ?
И более "случайный" ?

Зоранее спасибо.

Автор: Snowy 26.1.2007, 17:38
Код

var
  s: string;
  i: integer;
begin
  Randomize;
  s := '';
  for i := 0 to 10 + Random(10) do s:= s + Char(Random(256));
end;

Автор: Veitmen 26.1.2007, 17:42
smile Он это и имел ввиду.) Но здесь у тебя получается строка случайной величины (Т.е. размерность строки. Строка длиной от 10 до двадцати). А не случайная строка.

Добавлено @ 17:52 
А вообще, как я понимаю, ф-ия рендом тебе вполне подойдет. И твой вариант вполне элегантен и вполне случаен.) Юзай. )

Автор: Snowy 26.1.2007, 17:54
Цитата(Veitmen @  26.1.2007,  17:42 Найти цитируемый пост)
Но здесь у тебя получается строка случайной величины (Т.е. размерность строки. Строка длиной от 10 до двадцати). А не случайная строка.
А строка случайной длины из случайных символов менее случайна строки бесконечной длины из случайных символов? smile
Просто нужно сделать Randomize и будет всё очень даже случайно smile

Автор: Alexeis 26.1.2007, 17:55
Цитата(Gershkovich @  26.1.2007,  17:26 Найти цитируемый пост)
И более "случайный" ?

  Тогда нужно поискать другой генератор случайных чисел. Встроеный генератор, далек от совершенства.

Автор: Gershkovich 26.1.2007, 18:02
Похоже что Random это то что надо.
Не буду выпендриваццо.


Я просто думал, может в Делфи есть спец. функция...
ну или  там класс.


Всем спасибо.

Автор: W4FhLF 26.1.2007, 18:22
Ну так, если немного идеализировать и углубиться, то ГПСЧ можно выразить следующей формулой:

Val = F(X,Y,Z,I);

X - Cлучайный фактор, который не зависит от времени и конкретной машины. Например положение курсора, число тиков или загрузка ЦП. 
Y - Псевдо-случайный фактор, который зависит от машины. Например версия ОС или серийник винта.
Z - Не случайный зависимый фактор. Дата, время, кол-во секунд прошедших с момента перезагрузки.
I - любая константа. 

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

В итоге получим неплохой ГПСЧ. 

А для обычных, "домашних целей", сойдёт нечто вроде:

Код

function Randomize(): boolean; assembler;
asm
    db $0F; db $31;   // получаем кол-во тиков процессора
    mov Seed,eax
    call GetTickCount // получаем кол-во миллисекунд прошедших с момента перезагрузки
    sub Seed,eax
end;

function Rnd(): byte;
begin
  Seed := Seed*5345435+333;
  Result := (Seed div $FFFF) mod $7FFF;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize();
  ShowMessage(IntToStr(Rnd()));
end;


Автор: Gershkovich 29.1.2007, 18:07
W4FhLF, спасибо, код работает.

Я так понимаю что константы здесь 
Код

  Seed := Seed*5345435+333;
  Result := (Seed div $FFFF) mod $7FFF;


тожэ можно заменить какими-нить переменными типо Seed ??

Автор: aktuba 29.1.2007, 19:03
Gershkovich, я бы не советовал, т.к. эти константы не с потолка взяты. На них все и стоит...

Автор: Gershkovich 29.1.2007, 19:40
aktuba, 

честно говоря думал што с потолка, поэтому и задал вопрос... :)

А что эти констатнты обозначают ???


Автор: W4FhLF 30.1.2007, 18:08
Gershkovich, какие именно? 5345435 и 333 можешь менять как хочешь. 

Автор: razumsap 7.12.2009, 17:37
Добрый день.
Подскажите, переменную Seed как  и где надо объявлять? Бо редактор ругаетсяsmile
так Seed: Longint = 0;  правильно будет?

Автор: bems 7.12.2009, 22:06
К варианту со встроенным ГСЧ: правильней будет так
Код

Char(Random(Ord(High(Char)) + 1))

Автор: razumsap 8.12.2009, 09:11

M
THandle
Модератор: используйте подсветку кода!

Цитата(W4FhLF @ 26.1.2007,  18:22)
  ShowMessage(IntToStr(Rnd()));


Каким образом вызвать данную функцию рандом от числа?

В каком месте в этой функции нужно провести операцию (и собственно говоря какую?) чтоб рандом выдал числа от 0 до  37. 

Код

function Rnd(): byte;
begin
  Seed := Seed*5345435+333;
  Result := (Seed div $FFFF) mod $7FFF;
end;



Автор: Демо 8.12.2009, 17:48
Цитата(razumsap @  8.12.2009,  09:11 Найти цитируемый пост)
Каким образом вызвать данную функцию рандом от числа?


Чем эта функция лучше Rand?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)