Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: Stratovarius в Oct 21, 2007, 11:30



Титла: Rand() и osx
Публикувано от: Stratovarius в Oct 21, 2007, 11:30
Това е кода с който си вземам случайно число:

Примерен код
srand(time(0));
z = (int) (((double)rand() / ((double)(RAND_MAX) + (double)(1))) *100);


У нас на Mac OS X не работи. В университета го качвам и работи, предполагам че има нещо общо с стойността на RAND_MAX, връща винаги z=2 у нас.

някакви идеи ?


Титла: Rand() и osx
Публикувано от: task_struct в Oct 21, 2007, 13:07
Притеснява ме деленето. Ако rand() върне малко число (спрямо RAND_MAX), ще се получи стойност, клоняща към 0. При умножението по 100 може да се получи отрязване на част от стойността. Това зависи oт вида компилатора, процесора и размера на паметта, в която се прази променливата.
 Също така крайния резултат ти е int. Стройност от сорта на 0.000004234234 в int e 0 .





Титла: Rand() и osx
Публикувано от: Stratovarius в Oct 21, 2007, 14:41
И на мен ми беше странно, аз бих написал само rand() % 100, за да получа число между 0 и сто, но прочетох в един туториал че е грешно така понеше взимам под внимание само долните битове на числото и по малко случайно там беше описана от мен ползваната формула:

http://members.cox.net/srice1/random/crandom.html

която работи в университета, а у нас не ?

В университета работи с
gcc version 3.3.5 20050117 (prerelease) (SUSE Linux)
А у нас с не: gcc version 4.0.1 (Apple Computer, Inc. build 5367)





Титла: Rand() и osx
Публикувано от: tarator в Oct 21, 2007, 18:45
Ами примера ти показва, че умниците, измислили гениалната формула, по която смяташ не са чак толкова умни колкото си мислят :) Очевидно алгоритъма им не работи добре за случайната функция на Мака. Предполагам, че при тяхната функция ниските битове са по-случайни от високите. Между другото, ако направиш srand(), rand(), rand(), втория резултат е достатъчно случаен.


Титла: Rand() и osx
Публикувано от: Stratovarius в Oct 21, 2007, 19:12
всъщност проблема се корени в gcc.

Във версия 4.0 и на горе има друго  API за генериране на случайни числа.

И в manна версия 3.* пише да не се ползва rand() % x;

ще прочета целия ман и ще го предам така че да върви на унито, компилирано на gcc 3,  но ще разнищя ситуацията