Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Случайные числа С++

30K
29 декабря 2008 года
Дима Цветовик
13 / / 21.03.2008
подскажите как обойти проблему того что rand()%8 выдаёт одни и те же числа
42K
29 декабря 2008 года
Increaser
17 / / 24.11.2008
 
Код:
#include <time.h>
......
srand( (unsigned)time( NULL ) );
x = rand()%8
42K
02 января 2009 года
machgun
25 / / 02.01.2009
Цитата: Increaser
 
Код:
#include <time.h>
......
srand( (unsigned)time( NULL ) );
x = rand()%8



Я бы не рекомдовал использовать такой алгоритм ГСЧ, т.к. его довольно легко предугадать. Как говорил товарищь Z0MBiE: "генерация случайных чисел - слишком важный вопрос, чтобы оставлять его на волю случая."
Вот его варианты:

Цитата:
Улучшенный быстрый 32-битный генератор псевдослучайных чисел:
randseed dd ?
randcount db ?

randomize: pusha
call GetTickCount ; KERNEL32.GetTickCount
add randseed, eax
mov randcount, al
popa
retn

process_randseed:
mov eax, randseed
imul eax, 214013
add eax, 2531011
mov randseed, eax
dec randcount
jz randomize
retn

; вход: ECX=range
; выход: EAX=0..ECX-1

get_rnd_number: push ecx
push edx
call process_randseed
cmp ecx, 65536 ; необходимо
jb __mul ; только
__div: xor edx, edx ; если
div ecx ; ECX
xchg edx, eax ; бывает
jmp __exit ; >= 65536
__mul: shr eax, 16
imul eax, ecx
shr eax, 16
__exit: pop edx
pop ecx
retn

get_rnd_byte: call process_randseed
shr eax, 24
retn

get_rnd_dword: push ecx
call get_rnd_byte
shl eax, 24
xchg ecx, eax
call get_rnd_byte
shl eax, 16
or ecx, eax
call get_rnd_byte
mov ch, al
call get_rnd_byte
or eax, ecx
pop ecx
retn



Цитата:

; input: RANGE - on the stack
; output: eax=[0..RANGE-1], ZF=0 if EAX==0

rnd: mov eax, randseed
imul eax, 214013
add eax, 2531011
mov randseed, eax
shr eax, 16
imul eax, [esp+4]
shr eax, 16
ret 4

randomize: pusha
call GetTickCount
xor randseed, eax
popa
ret



Цитата:

пример генерации буфера из случайных чисел, с использованием маздайных средств:
HCRYPTPROV hProv;
if (CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) != 0)
return -1;
BYTE* buf = new BYTE[ 65536 ];
CryptGenRandom(hProv, 65536, buf);
CryptReleaseContext(hProv, 0);



и т.д. и т.п.

502
02 января 2009 года
Jail
550 / / 30.01.2007
To machgun:
Вы всегда используете С++ код перенасыщенный ассемблерными вставками?
Если честно - то выглядит уродски.
5
02 января 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Jail
Если честно - то выглядит уродски.

Самое главное - алгоритм генерирования совсем неочевиден.

43K
05 января 2009 года
Mr. Stalker
8 / / 12.12.2008
А если нужно числа от 1 до 9 включительно? Какой примерно код нужно писать (с использованием rand() ). Например a=1; b=9;
63
05 января 2009 года
Zorkus
2.6K / / 04.11.2006
rand()%8 выдает один из 8 вариантов, верно? :)

Если это нужно для прикладной задачи, а я примерно на 99,99% уверен, что это то, чем вы занимаетесь, то достаточно стандартного ГПСЧ, берете стандартный или улучшенный рандом (из нормальной библиотеки, нормально реализованный и документированный, а не тот код, который тут привели выше как образец), и юзаете.

Если вам нужны истинно случайные числа (или псевдослучайные, приближенные к таковым) -- сначала обоснуйте, зачем. Потому что алгоритм истинно случайных чисел, вообще говоря, оксюморон.
42K
05 января 2009 года
machgun
25 / / 02.01.2009
Цитата: Mr. Stalker
А если нужно числа от 1 до 9 включительно? Какой примерно код нужно писать (с использованием rand() ). Например a=1; b=9;



Например, так:

 
Код:
unsigned int rnd()
{
    seed^=0xDEADC0DE;
    seed=(seed >> 16) | (seed << 16);
    seed-=GetTickCount();
    seed*=0xE9192939;

    return (seed % 9 + 1);
}
63
06 января 2009 года
Zorkus
2.6K / / 04.11.2006
Цитата: machgun
Например, так:

 
Код:
unsigned int rnd()
{
    seed^=0xDEADC0DE;
    seed=(seed >> 16) | (seed << 16);
    seed-=GetTickCount();
    seed*=0xE9192939;

    return (seed % 9 + 1);
}


Я все понимаю, и твой код на самом деле неплохо генерит псевдослучайные числа, но все же автор-то то просил с использованием стандартных функций по работе с псевдослучайными числами.
Чтобы сгенерить, не вникая в тонкости их генерации.

5
06 января 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Mr. Stalker
А если нужно числа от 1 до 9 включительно? Какой примерно код нужно писать (с использованием rand() ). Например a=1; b=9;

Думать мы уже разучились, ага?

 
Код:
int range_rand(int a, int b) {
  int range = b - a + 1;
  int d = rand() % range;
  return a + d;
}

З.Ы. Zorkus, не пинай за медвежью услугу.
20K
14 января 2009 года
sja
22 / / 08.01.2007
если задача простая то подойдет rand.
пример использования уже был приведен, но обратимся к первоситочнику:
http://www.cplusplus.com/reference/clibrary/cstdlib/rand.html

только srand выполняйте 1 раз при старте. а потом только щелкайте rand и всё!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог