Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2013, 14:20   #1
goluzov
Форумчанин
 
Регистрация: 26.06.2010
Сообщений: 168
По умолчанию функция rand()

вобщем мне нужно сгенерировать случайные числа

Код:
srand(1);
for(int i = 0; i < 1000; i++) printf("%d\n", rand() % (255 + 1));
проверил на виртуалке. на вин 2000, вин 7, xp

везде выдает одинаковые числа.... т.е. первая цифра

41
35
...

последние

128
132
217

мне так и нужно.

только я вот думаю это может только на моем процесоре так выдает? или может на windows 8 уже будет не теже самые числа выдавать.... или может винда когда ни будь выйдет обновление и числа будут уже не теми
goluzov вне форума Ответить с цитированием
Старый 04.02.2013, 14:24   #2
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

rand() выдаёт по "таблице".
его никто не намерен менять..
тем более гейтцы.
они лишь добавят новое а это задробят.. и в хейдерах не будет.
Тем кого не устраивает стандартный пишут свой.
____
обычно он людей бесит тем, что это не фига не случайные числа.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 04.02.2013, 14:44   #3
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
только я вот думаю это может только на моем процесоре так выдает? или может на windows 8 уже будет не теже самые числа выдавать.... или может винда когда ни будь выйдет обновление и числа будут уже не теми
К версии Windows это не имеет ни малейшего отношения. Может начать выдавать другие числа, если пересобрать другим компилятором.
Abstraction вне форума Ответить с цитированием
Старый 04.02.2013, 16:00   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

могу со своим замечанием "ткнуть пальцем в небо", ибо, вообще не понимаю, откуда возникло такое обсуждение..


а кто за Вас будет иницилизировать генератор случайных чисел случайным значением?!! (обычно берут милисекунды для этой цели)

видел, что люди, пишущие на C/C++ делают это примерно так:
Код:
/* initialize random seed: */
   srand ( time(NULL) );
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.02.2013, 16:04   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
а кто за Вас будет иницилизировать генератор случайных чисел случайным значением?!! (обычно берут милисекунды для этой цели)
Так ТС'у вроде как надо именно повторяемую последовательность, отсюда и srand(1).
Abstraction вне форума Ответить с цитированием
Старый 04.02.2013, 16:48   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Abstraction
Так ТС'у вроде как надо именно повторяемую последовательность, отсюда и srand(1).
Ага. Вы правы. Теперь я увидел:

Цитата:
Сообщение от goluzov
мне так и нужно.
извините, что влез со своим замечанием.

И согласен с вашим мнением, насчёт компилятора! Хотя, дать руку на отсечение, что не используется какая-то WinAPI-шная функция, и что её измененение не повлияет на "случайные" числа, я бы не стал!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.02.2013, 17:54   #7
_SOKOL_
Пользователь
 
Регистрация: 02.02.2013
Сообщений: 44
По умолчанию

Код:
srand(time(NULL));
int a, b;
a = rand()%20;
b = rand()%20;
будут тебе числа с остатком от деления на 20
как уже было выше сказано, числа идут по таблице, изменить их нельзя, можно начать считать долисекунды с 1970-го года, для этого и нужна команда srand(time(NULL));
_SOKOL_ вне форума Ответить с цитированием
Старый 04.02.2013, 20:11   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
_SOKOL_
, Вы, похоже, так же, как и я сначала, не разобрались в сути проблемы. Автору темы нужные случайные числа, но, которые будут при каждом запуске программы ПОВТОРЯТЬСЯ! И он переживает, что когда программа будет запущена под другой версией Windows, последовательность чисел будет ДРУГАЯ. Ему же нужно, чтобы последовательность была одинакова на любой Windows (ну, по крайней мере, любой, на которой программа вообще запустится, конечно).
Если же проиницилизировать генератор случ.чисел временной отметкой - числа при каждом запуске будут разные. Это автору топика НЕ НАДО.


Цитата:
числа идут по таблице,
Нет, имхо, никакой таблицы нет (и не нужно)! Есть сложная, математически обоснованная, итерационная формула-полином. Каждый следущий член ряда генерится на основании предыдущего значения. Но проблема в том, что в очередной версии компилятора этот самый полином может быть изменён (улучшен, например), это приведёт к генерации новой _ДРУГОЙ_ последовательности случайных чисел
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.02.2013, 21:49   #9
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Но проблема в том, что в очередной версии компилятора этот самый полином может быть изменён (улучшен, например), это приведёт к генерации новой _ДРУГОЙ_ последовательности случайных чисел
Вся эта погонь в kernel32.dll если речь о 32 разрядной ос. Поэтому компилу будет богом, что второму, что третьему.

Что дело до формулы. То если пощупать справки, то можно понять, что rand() генерирует те же числа лишь для отладки программы. так что srand(1) не нужен в корень. srand() влияет на результат rand() сдвигая на шаг в таблице. поскольку time всегда даёт другое число, то на выходе мы типо видем рандомные числа.. но это не так. таблица рандомовых чисел за ранее просчитана и её длина от 0 до RAND_MAX. примерно 65356 / 2.
__________
RAND_MAX
_________
Цитата:
Нет, имхо, никакой таблицы нет (и не нужно)
Вы ошибаетесь... очень и нужна... как я и говорил, при отладке. И в то же время для моментального получения числа. Это очень важно особенно для игр... Если вы понимаете, то вспомните хотя бы про md2. Там даже заранее просчитаны нормали. Машины были слабенькие....
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 04.02.2013 в 22:17.
Perchik71 вне форума Ответить с цитированием
Старый 04.02.2013, 23:44   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Нет, имхо, никакой таблицы нет (и не нужно)! Есть сложная, математически обоснованная, итерационная формула-полином. Каждый следущий член ряда генерится на основании предыдущего значения. Но проблема в том, что в очередной версии компилятора этот самый полином может быть изменён (улучшен, например), это приведёт к генерации новой _ДРУГОЙ_ последовательности случайных чисел
Линейная конгруэнтная формула.

Я однажды потрошил порт libstdc++, интересно было поглазеть на исходники.

Хотите узнать, какая там была формула?

Код:
struct SRandom
    {
        static int GetRandom(int minVal, int maxVal)
        {
            const bool ERROR_MIN_CAN_NOT_BE_MORE_MAX = minVal>maxVal;
            assert(!ERROR_MIN_CAN_NOT_BE_MORE_MAX);
            return RND()%(maxVal-minVal+1)+minVal;
        }
        
        static int GetTick()
        {
            int timeNOW;
            _asm
            {
                rdtsc;
                mov [timeNOW],eax;
            }
            return timeNOW;
        }

        static int RND() 
        { 
            static int seed = GetTick();
            return ( ((seed = seed * 214013L + 2531011L ) >> 16)& 0x7fff);
        }
    };
Потом я узнал про существование множества подобных формул.
Каждая из них якобы обладает особыми свойствами: дают очень хорошее покрытие случайности по диапазону.

Если для компьютерной игрушки - этой формулы за глаза хватит. Я кстати, с виндузятным рандомом тестировал. Они показали удивительно схожие результаты)

Если если для гурманов (с блэкджеком и шлюхами), то можно использовать мерсене:
http://ru.wikipedia.org/wiki/%C2%E8%...F1%E5%ED%ED%E0

Он тоже позволяет самому задавать сид, и ещё кучу всяких настроек, вплоть до указания распределения по гаусу

Последний раз редактировалось _Bers; 04.02.2013 в 23:47.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
rand xamelion Visual C++ 7 11.01.2012 14:24
Функция rand Mehanizator Помощь студентам 2 13.08.2011 14:02
функция генерации случайных чисел rand() в main pufystyj Общие вопросы C/C++ 4 08.02.2011 21:09
с++ rand Якъ Помощь студентам 4 10.11.2010 22:47
rand() ????? Revenholm Общие вопросы C/C++ 7 25.04.2009 18:47