Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > rand В Windows


Автор: devmstr 28.3.2005, 23:00
Какая есть замена для rand в Windows, так как stdlib в виндомов приложении, как - то не хочется!

Автор: Nastya 29.3.2005, 08:00
Код

#include <stdlib.h>
#include <time.h>

........
srand(time(NULL));


Автор: chipset 29.3.2005, 08:17
magician, а в чём проблема написать свою, вычисляющую рандом перемножением серийного номера коврика от мыши и текущего времени в Нью Йорке? smile

Автор: srd 29.3.2005, 09:46
Даже виндовое приложение линкуется с CRT, и отвязаться от неё без извращений нельзя. Потому можешь совершенно спокойно использовать <cstdlib>

Автор: devmstr 30.3.2005, 07:16
srd Спасибо!
Ща юзаю

#define RAND_MAX 0x7fff
#define rand() ((int)((0xDEADBEEF*GetTickCount()+0xBABA)%RAND_MAX))

Нескожу что лучше стандавтного, но работает!

Автор: oleg1973 30.3.2005, 16:49
Цитата
Даже виндовое приложение линкуется с CRT, и отвязаться от неё без извращений нельзя

не правда
а рандом можно из GetTickCount сотворить

Автор: maxim1000 30.3.2005, 16:57
Цитата
Даже виндовое приложение линкуется с CRT, и отвязаться от неё без извращений нельзя

Цитата
не правда

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

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

Автор: Void 30.3.2005, 18:34
Цитата(maxim1000 @ 30.3.2005, 16:57)
просто GetTickCount не всегда хорошо - кто его знает, с какой периодичностью будут вызывать эту функцию? может так нехорошо получиться, что значения совсем не будут похожи на случайные


Есть еще вариант - использовать CryptoAPI. Может быть, из пушки по воробьям, зато уж точно никакой закономерности:

Код

DWORD MyRandom(void) {
    DWORD result;
    HCRYPTPROV hProv;
    if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, NULL)) {
        CryptGenRandom(hProv, sizeof(DWORD), (BYTE*) &result);
        CryptReleaseContext(hProv, NULL);
    }
    return result;
}


В случае ошибки вернет просто неслучайный мусор из стека, но это маловероятно.

Автор: devmstr 30.3.2005, 23:22
Цитата(Void @ 30.3.2005, 18:34)
CryptGenRandom

Глючная она. Намучался я с ней в свое время!!

Автор: Void 31.3.2005, 18:00
Цитата(magician @ 30.3.2005, 23:22)

CryptGenRandom
Глючная она. Намучался я с ней в свое время!!

А в чем конкретно глючность заключается, можно узнать?

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