Датчик случайных чисел в С++
От: LaptevVV Россия  
Дата: 24.01.08 13:38
Оценка:
Обнаружил в мсдн информацию про датчик случайных чисел
rand_s()
Однако заставить его работать, следуя указаниям мсдн, мне не удалось. Мож кто знает, как это сделать?

И еще вопрос.
При создании динамического массива выражение-размер может быть дробным и даже отрицательным.
Дотнет 2005 никаких сообщений не выдает. Тут случайно не UB?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Датчик случайных чисел в С++
От: astral_marine  
Дата: 24.01.08 13:50
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Обнаружил в мсдн информацию про датчик случайных чисел

LVV>rand_s()
LVV>Однако заставить его работать, следуя указаниям мсдн, мне не удалось. Мож кто знает, как это сделать?

Этот пример у меня работает
http://msdn2.microsoft.com/en-us/library/sxtz2fa8(VS.80).aspx

LVV>При создании динамического массива выражение-размер может быть дробным и даже отрицательным.

В std::vector тип размера — size_t — целой беззнаковое число.
Re: Датчик случайных чисел в С++
От: Left2 Украина  
Дата: 24.01.08 14:42
Оценка:
LVV>При создании динамического массива выражение-размер может быть дробным и даже отрицательным.
LVV>Дотнет 2005 никаких сообщений не выдает. Тут случайно не UB?
Тут конверсия из double в size_t (или из signed int в size_t).

int* i = new int[1.4];


c:\documents and settings\left.avalanche\my documents\visual studio 2008\projects\tst\tst\tst.cpp(67) : warning C4244: 'initializing' : conversion from 'double' to 'unsigned int', possible loss of data

a Warning level у тебя какой стоит?
... << RSDN@Home 1.2.0 alpha rev. 717>>
Re: Датчик случайных чисел в С++
От: Mr.Cat  
Дата: 24.01.08 15:08
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Обнаружил в мсдн информацию про датчик случайных чисел

LVV>rand_s()
LVV>Однако заставить его работать, следуя указаниям мсдн, мне не удалось. Мож кто знает, как это сделать?

Странно, у меня пример из MSDN нормально работает. Вообще, в MSDN указано, что rand_s() работает только на WinXP и более "новых" системах. Может, в этом дело?
Re[2]: Датчик случайных чисел в С++
От: LaptevVV Россия  
Дата: 25.01.08 06:41
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, LaptevVV, Вы писали:


LVV>>Обнаружил в мсдн информацию про датчик случайных чисел

LVV>>rand_s()
LVV>>Однако заставить его работать, следуя указаниям мсдн, мне не удалось. Мож кто знает, как это сделать?

MC>Странно, у меня пример из MSDN нормально работает. Вообще, в MSDN указано, что rand_s() работает только на WinXP и более "новых" системах. Может, в этом дело?

Понял! У меня 2000 с сервис-паками стоит. Спасибо!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Датчик случайных чисел в С++
От: LaptevVV Россия  
Дата: 25.01.08 06:41
Оценка:
Здравствуйте, Left2, Вы писали:

LVV>>При создании динамического массива выражение-размер может быть дробным и даже отрицательным.

LVV>>Дотнет 2005 никаких сообщений не выдает. Тут случайно не UB?
L>Тут конверсия из double в size_t (или из signed int в size_t).

L>
L>int* i = new int[1.4];
L>


L>c:\documents and settings\left.avalanche\my documents\visual studio 2008\projects\tst\tst\tst.cpp(67) : warning C4244: 'initializing' : conversion from 'double' to 'unsigned int', possible loss of data


L>a Warning level у тебя какой стоит?

Спасибо за напоминание. Понятно, что преобразование идет, только я забыл выставить уровень предупреждений высокий.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Датчик случайных чисел в С++
От: Pavel Dvorkin Россия  
Дата: 25.01.08 10:15
Оценка: 12 (3) +2 :))
Здравствуйте, LaptevVV, Вы писали:

LVV>rand_s()


Жуткая функция!

Зашел на этот линк

http://msdn2.microsoft.com/en-us/library/sxtz2fa8(VS.80).aspx

Оказывается, в ней security enhancements as described in Security Enhancements in the CRT.

В чем они заключаются ? А вот в чем

the function invokes an invalid parameter handler, as described in Parameter Validation.

Ну да, конечно. У прежней rand никаких параметров не было, так что в чем она провинилась перед Security Enhancements — сказать трудно. А у этой параметр появился, да еще указатель — как тут без Validation!

Но это еще не все. Иду по странице

rand_s depends on the RtlGenRandom API, which is only available in Windows XP and later

захожу на ссылку по RtlGenRandom и...

Content cannot be found

Во как! Ладно, иду в online MSDN

RtlGenRandom
[The RtlGenRandom function is available for use in the operating systems listed in the Requirements section. It may be altered or unavailable in subsequent versions. Instead, use the CryptGenRandom function.]

The RtlGenRandom function generates a pseudo-random number.

Note This function has no associated import library. This function is available as a resource named SystemFunction036 in Advapi32.dll. You must use the LoadLibrary and GetProcAddress functions to dynamically link to Advapi32.dll.

Кошмар!
With best regards
Pavel Dvorkin
Re[2]: Датчик случайных чисел в С++
От: LaptevVV Россия  
Дата: 26.01.08 06:47
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

LVV>>rand_s()

PD>Жуткая функция!
PD>Зашел на этот линк
PD>http://msdn2.microsoft.com/en-us/library/sxtz2fa8(VS.80).aspx
PD>Оказывается, в ней security enhancements as described in Security Enhancements in the CRT.
PD>В чем они заключаются ? А вот в чем
PD>the function invokes an invalid parameter handler, as described in Parameter Validation.
PD>Ну да, конечно. У прежней rand никаких параметров не было, так что в чем она провинилась перед Security Enhancements — сказать трудно. А у этой параметр появился, да еще указатель — как тут без Validation!
PD>Но это еще не все. Иду по странице
PD>rand_s depends on the RtlGenRandom API, which is only available in Windows XP and later
PD>захожу на ссылку по RtlGenRandom и...
PD>Content cannot be found
PD>Во как! Ладно, иду в online MSDN
PD>RtlGenRandom
PD>[The RtlGenRandom function is available for use in the operating systems listed in the Requirements section. It may be altered or unavailable in subsequent versions. Instead, use the CryptGenRandom function.]
PD>The RtlGenRandom function generates a pseudo-random number.
PD>Note This function has no associated import library. This function is available as a resource named SystemFunction036 in Advapi32.dll. You must use the LoadLibrary and GetProcAddress functions to dynamically link to Advapi32.dll.

PD>Кошмар!


Спасибо за исследования!
Я на своей 2000 добился отсутствия ошибок трансляции. Но прога завершалась при обращении к этой функции. Теперь понятно, почему.
Дома инета не было, поэтому по линкам пройти не мог. Но первая ссылка в MSDN такая же, как и на сайте.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Датчик случайных чисел в С++
От: Nazik Россия  
Дата: 26.01.08 13:32
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, LaptevVV, Вы писали:


LVV>>rand_s()


PD>Жуткая функция!


PD>Кошмар!


Я склонен думать, что эту функцию назвали Secure не из-за её параметров, а из-за того, что она использует системный датчик случайных чисел, а не самописный (который используется в rand и оставляет желать лучшего). Т.е. под Secure имеется в виду то, что её можно использовать при решении криптографических задач.
Re[3]: Датчик случайных чисел в С++
От: Mr.Cat  
Дата: 26.01.08 15:57
Оценка:
Здравствуйте, Nazik, Вы писали:
N>Т.е. под Secure имеется в виду то, что её можно использовать при решении криптографических задач.

Эм... Самостоятельно почитав то, что написано про RtlGenRandom, я вообще побоялся бы rand_s использовать.
Re[4]: Датчик случайных чисел в С++
От: Roman Odaisky Украина  
Дата: 26.01.08 23:14
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Эм... Самостоятельно почитав то, что написано про RtlGenRandom, я вообще побоялся бы rand_s использовать.


И правильно. Всё намного проще. Читай байты из /dev/random, и будет тебе счастье.

(Чем одно платформеннозависимое решение лучше другого?)
До последнего не верил в пирамиду Лебедева.
Re[3]: Датчик случайных чисел в С++
От: Pavel Dvorkin Россия  
Дата: 28.01.08 07:18
Оценка:
Здравствуйте, Nazik, Вы писали:


N>Я склонен думать, что эту функцию назвали Secure не из-за её параметров, а из-за того, что она использует системный датчик случайных чисел, а не самописный (который используется в rand и оставляет желать лучшего).


Я таки очень извиняюсь, но чем системный отличается от самописного, если речь идет о продукции Микрософт ?

>Т.е. под Secure имеется в виду то, что её можно использовать при решении криптографических задач.


Не стоит

[The RtlGenRandom function is available for use in the operating systems listed in the Requirements section. It may be altered or unavailable in subsequent versions. Instead, use the CryptGenRandom function.]
With best regards
Pavel Dvorkin
Re[4]: Датчик случайных чисел в С++
От: Nuzik Россия  
Дата: 30.01.08 12:19
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Я таки очень извиняюсь, но чем системный отличается от самописного, если речь идет о продукции Микрософт ?


Извиняюсь за оффтоп, но складывается чувство, что здесь собрались сплошь латентные микрософтофобы Не подумайте, что я являются проповедником микрософта — там _s функции в проектах не использую почти никогда, первым же делом всегда дефайню _CRT_SECURE_NO_DEPRECATE
Re[5]: Датчик случайных чисел в С++
От: Nuzik Россия  
Дата: 30.01.08 12:20
Оценка:
Извиняюсь за оффтоп, но складывается чувство, что здесь собрались сплошь латентные микрософтофобы Не подумайте, что я являются проповедником микрософта — сам _s функции в проектах не использую почти никогда, первым же делом всегда дефайню _CRT_SECURE_NO_DEPRECATE
Re[5]: Датчик случайных чисел в С++
От: Mr.Cat  
Дата: 30.01.08 13:25
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:
RO>И правильно. Всё намного проще. Читай байты из /dev/random, и будет тебе счастье.
RO>(Чем одно платформеннозависимое решение лучше другого?)

Не понимаю иронии. /dev/random — платформозависимое решение, а rand_s() — решение, которое по сути не рекомендует использовать сам разработчик.
Re[6]: Датчик случайных чисел в С++
От: lifrsdn  
Дата: 30.01.08 13:30
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, Roman Odaisky, Вы писали:

RO>>И правильно. Всё намного проще. Читай байты из /dev/random, и будет тебе счастье.
RO>>(Чем одно платформеннозависимое решение лучше другого?)

MC>Не понимаю иронии. /dev/random — платформозависимое решение, а rand_s() — решение, которое по сути не рекомендует использовать сам разработчик.


Гм, боюсь спросить, а где именно написано, что не рекомендует?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Датчик случайных чисел в С++
От: lifrsdn  
Дата: 30.01.08 13:30
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, Nazik, Вы писали:

N>>Т.е. под Secure имеется в виду то, что её можно использовать при решении криптографических задач.

MC>Эм... Самостоятельно почитав то, что написано про RtlGenRandom, я вообще побоялся бы rand_s использовать.


А что именно вас так испугало?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: Датчик случайных чисел в С++
От: Mr.Cat  
Дата: 30.01.08 13:52
Оценка: +1
Здравствуйте, lifrsdn, Вы писали:
L>Гм, боюсь спросить, а где именно написано, что не рекомендует?
здесь

...хотя тут вот товарищ вовсю RtlGenRandom рекламирует.

Ситуация такая:

On a default Windows XP and later install, CryptGenRandom calls into a function named ADVAPI32!RtlGenRandom, which does not require you load all the CryptAPI stuff.

то бишь

По умолчанию, начиная с Windows XP и CryptGenRandom обращается к функции ADVAPI32!RtlGenRandom, которая не требует загрузки CryptoAPI.

Вот. Идея заключается в том, чтобы не загружая CryptoAPI получить "сильные" случайные числа. Только способ получается платформозависимым. Правда я сомневаюсь, что MS уберет RtlGenRandom из будущих версий винды.
Re[8]: Датчик случайных чисел в С++
От: lifrsdn  
Дата: 30.01.08 14:08
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, lifrsdn, Вы писали:

L>>Гм, боюсь спросить, а где именно написано, что не рекомендует?
MC>здесь

MC>...хотя тут вот товарищ вовсю RtlGenRandom рекламирует.


MC>Ситуация такая:

MC>

MC>On a default Windows XP and later install, CryptGenRandom calls into a function named ADVAPI32!RtlGenRandom, which does not require you load all the CryptAPI stuff.

MC>то бишь
MC>

MC>По умолчанию, начиная с Windows XP и CryptGenRandom обращается к функции ADVAPI32!RtlGenRandom, которая не требует загрузки CryptoAPI.

MC>Вот. Идея заключается в том, чтобы не загружая CryptoAPI получить "сильные" случайные числа. Только способ получается платформозависимым. Правда я сомневаюсь, что MS уберет RtlGenRandom из будущих версий винды.

CryptGenRandom требует HCRYPTPROV. Чтобы её вызвать нужно всё равно загрузить CryptoAPI получается.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: Датчик случайных чисел в С++
От: lifrsdn  
Дата: 30.01.08 14:15
Оценка:
Здравствуйте, lifrsdn, Вы писали:

L>CryptGenRandom требует HCRYPTPROV. Чтобы её вызвать нужно всё равно загрузить CryptoAPI получается.


Извиняюсь, ошибался. CryptAcquireContext оказывается тоже из Advapi32 экспортируется.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.