Try saying "Robert Redford" 10 times fast
Товарищи программисты, скажите, а в Pascal функция random может выбирать случайное только из чисел?
Нельзя никак применить ее к символьному типу? и если можно, то как?
Или, может, как-нибудь по-другому можно выбрать случайный символ?


@темы: Pascal

Комментарии
29.11.2011 в 17:38

IDDQD - Команда молодости нашей, команда, без которой мне не жить.
Техника проста. У тебя допустимый набор символов - это массив. С помощью генератора генерируешь случайное число от 1 до size этого массива, после чего интерпретируешь его как индекс в массиве. Т. е. выбираешь из массива символ по индексу, равному сгенерированному числу.
29.11.2011 в 17:39

Try saying "Robert Redford" 10 times fast
Flex Ferrum, о, это гениально!
благодарствую)
29.11.2011 в 20:14

можно еще так: генерируете с помощью random число от 1 до 255, а потом это число переводите функцией в символ. функция вроди chr(), пример chr(219) вернет "["

не скажу точно с какого числа лучше начинать, но вроде первые 30 символов непечатаемые, поэтому имело бы смысл генерировать от 30 до 255 или любой другой диапазон какой вам понравиться.
29.11.2011 в 22:40

Я болен небом. Я в него влюблен...
fess2007, лично мне это решение кажется намного более практичным
30.11.2011 в 01:37

создаю островки хаоса в пучине порядка
Да, последнее решение оптимальней, только в общем случае там нужно обращать внимание на кодировку. В юникоде коды символов другие будут. Хотя, если речь именно о чистом Паскале, а не о Делфи, то можно не беспокоиться =)
30.11.2011 в 01:52

первый вариант будет быстрее работать, так как значения будут браться напрямую из памяти, а не запускаться доп. процедуры для каждого символа, а вариантов реализации много, можно соединить первые 2 варианта и сделать хеш-таблицу для значений, возвращенных chr(), или можно собрать массив однобайтных целых (не помню, как они в паскале) с размером массива в первой ячейке и через указатели взять по адресу массива строку :alles:

поиграем, кто следующий что предложит? =)
30.11.2011 в 10:05

smll

я не претендую на скорость работы но вы не забывайте о том что в первом варианте используется дополнительная память на хранение массива чего нет во втором.
30.11.2011 в 12:46

fess2007,
вот смысл вашего последнего сообщения? iCindy уже выбрала вариант, а другим доказывать смысла нету.
вспомнил старый добрый анекдот:

Даны числа от 1 до 10. Надо напечатать 0, если число четное, и 1 — в противном случае.
Как решают эту задачу:
Учитель информатики в школе:
if х=2 or x=4 or х=6 or x=8 or x=10 then write(0) else write(1);
Преподаватель в институте:
if not odd(x) then write(0) else write(1);
Студент:
write(x mod 2);
Профессиональный программер:
var а:аrrау[1..10] := (1,0,1,0,1,0,1,0,1,0); write(a[x]);
30.11.2011 в 13:43

Люди никогда не достигнут совершенства, пока будут оставаться людьми...
smll, а я, как настоящий профессиональный программер, написал бы

x and 1

т.к. это ещё быстрее, особенно на современных машинах типа i7 видна эта разница, между not odd(x) и a[x] ;)


Вообще, уважаемый smll, вы походите более на школоло уровня 10го класса. А если вдруг выяснится, что надо делить на три? А число в диапазоне до 100 -- будете весь массив переписывать?

Настоящий профессиональный программер будет думать в первую очередь о сопровождении программы, даже если это ассемблер и требуется жёсткая оптимизация.
30.11.2011 в 13:56

[revolver],
я умиляюсь вашей серьезностью, вы вообще анекдоты не воспринимаете или только относящиеся к вашей профессии?
30.11.2011 в 17:13

Люди никогда не достигнут совершенства, пока будут оставаться людьми...
smll, только в рабочее время. А вне рабочего времени стараюсь развиваться всесторонне.
30.11.2011 в 18:23

Try saying "Robert Redford" 10 times fast
fess2007, На самом деле первый вариант универсальнее.
Конкретно в моем случае мне нужны были символы, но может понадобиться выбрать рандомную строку, файл и.т.д.
А для символов ваше решение довольно изящное, мне кажется)