Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сгенерить строку из случайных символов, Как ? 
:(
    Опции темы
Gershkovich
Дата 26.1.2007, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 8.2.2006

Репутация: 0
Всего: 2



Всем привет !

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

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

Код

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


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

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

PM MAIL   Вверх
Snowy
Дата 26.1.2007, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Код

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

PM MAIL   Вверх
Veitmen
Дата 26.1.2007, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: нет
Всего: 4



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

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

Это сообщение отредактировал(а) Veitmen - 26.1.2007, 17:46
PM MAIL ICQ   Вверх
Snowy
Дата 26.1.2007, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Veitmen @  26.1.2007,  17:42 Найти цитируемый пост)
Но здесь у тебя получается строка случайной величины (Т.е. размерность строки. Строка длиной от 10 до двадцати). А не случайная строка.
А строка случайной длины из случайных символов менее случайна строки бесконечной длины из случайных символов? smile
Просто нужно сделать Randomize и будет всё очень даже случайно smile
PM MAIL   Вверх
Alexeis
Дата 26.1.2007, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



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

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Gershkovich
Дата 26.1.2007, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 8.2.2006

Репутация: 0
Всего: 2



Похоже что Random это то что надо.
Не буду выпендриваццо.


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


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

PM MAIL   Вверх
W4FhLF
Дата 26.1.2007, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



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

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;



Это сообщение отредактировал(а) W4FhLF - 26.1.2007, 18:37


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Gershkovich
Дата 29.1.2007, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 8.2.2006

Репутация: 0
Всего: 2



W4FhLF, спасибо, код работает.

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

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


тожэ можно заменить какими-нить переменными типо Seed ??
PM MAIL   Вверх
aktuba
Дата 29.1.2007, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Gershkovich, я бы не советовал, т.к. эти константы не с потолка взяты. На них все и стоит...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Gershkovich
Дата 29.1.2007, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 8.2.2006

Репутация: 0
Всего: 2



aktuba, 

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

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


PM MAIL   Вверх
W4FhLF
Дата 30.1.2007, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Gershkovich, какие именно? 5345435 и 333 можешь менять как хочешь. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
razumsap
  Дата 7.12.2009, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 13.12.2007

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) razumsap - 7.12.2009, 17:43
PM MAIL ICQ   Вверх
bems
Дата 7.12.2009, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



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

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



--------------------
Обижено школьников: 8
PM MAIL   Вверх
razumsap
Дата 8.12.2009, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 13.12.2007

Репутация: нет
Всего: нет




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;




Это сообщение отредактировал(а) razumsap - 8.12.2009, 14:59
PM MAIL ICQ   Вверх
Демо
Дата 8.12.2009, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



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


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


--------------------
    
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0593 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.