Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Случайные числа [ Vc++ ] (https://forum.antichat.xyz/showthread.php?t=44228)

GlOFF 11.07.2007 18:34

Случайные числа [ Vc++ ]
 
Интересует данная тема (Случайные числа в MVС++ и их генератор). В делфи имеется функция Random в паре с Randomize. Как быть с получением случайных чисел в VС++ ? Может есть свои методы или модули ? Подскажите плз, в каком направлении копать или у кого подобный вопрос уже решался и имеются наработки...

// Ну и для извращенцев, интересны технологии создания генератора

Ni0x 11.07.2007 18:41

для псевдослучайных используют функцию rand() из RTL.

Ni0x 11.07.2007 19:16

xqwerx, вот тебе исходник по теме:
Код:

#include <windows.h>
#include <stdio.h>
unsigned long rs_randseed;

void _srand()
{
  rs_randseed = GetTickCount();
}

unsigned long _rand()
{
  rs_randseed++;
  return (rs_randseed*0xF02CE551) + 0x7FF2742B;
}
int main()
{
int a;
_srand();
a=_rand();
char *pa;
printf("This: ",itoa(a,pa,10));
return 0;   
}


iv. 11.07.2007 20:47

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

GlOFF 11.07.2007 20:52

Ni0x С часиками интересно получилось! Главное фантазия :) А я то загонялся со стековым генератором ....

Ni0x 11.07.2007 20:57

iv. , я не говорю что получаются случайные числа, я вроде написал для псевдослучайных

_Great_ 11.07.2007 21:13

ТС: srand/rand читай описание к CRT.

_Great_ 11.07.2007 21:34

Реализовать генератор можно проще... Rdtsc и все дела.

ZaCo 11.07.2007 22:37

смотря что понимать под случайностью. пусть надо сгенерировать "случайное" двухбайтное число (если меньше то отрубаем результат mod по границе, если например четырехбайтное то аналогично) не используя "железок". под случайным числом будем понимать результат 16-ти бит, такой что кол-во битов установленных в единицу в среднем будет никак не меньше битов установленных в ноль и более того, среднее количество "попаданий" в старший не должно быть меньше или больше чем в младший. полное равноправия битов в среднем, однако расположение их в текущий момент времени должно быть абсолютно случайно:) по этой причине, пример от Ni0x ну вообще не годится, хотя бы потому, что умножение на число ну никакой случайности не добавляет, а сложение и тем более на случайность выпадения битов. могу предложить только аналогичный вариант, но с циклическим сдвигом результата на половину слова (в данном случае на 8 бит) и двоичного сложения с первоначальным... потому что xor абсолютно демократичен как к 1 так и к 0, а сдвиг добавит равноправия между старшими и младшими битами.

Ni0x 11.07.2007 22:42

если кому интересно, в библиотеке boost для c++ есть уже готовые решения
http://boost.org/libs/random/index.html


Время: 16:03