[Помощь] Рандом не рандомный

Для тех, кто хочет сделать мир лучше.
Закрыто
Сообщение
Автор
Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#1 Сообщение 19.08.2010, 11:58

Наткнулся на непонятную проблему с использованием rand и srand в С/С++.
Вот код:

Код: Выделить всё

srand(time(NULL));
printf("%d",rand());
По идее в консоль должны выплевываться рандомные(!) числа, однако при многократном запуске программы было установлено, что следующее число = текущее + 3 и обновляется оно раз в секунду (из-за time(0)). И это при рандоме-то.
Брал примеры из сети, компилировал как C-код, как С++-код. Подключал ctime вместо time.h. Всё без толку.
Открыл CodeBlocks (там у меня GCC) и скомпилил - тоже самое. Врубил виртуалку с девственно чистым дебианом - тоже самое и с Gcc и с G++.
Перезагрузился в Linux, там все просто отлично, распределение ровное, числа рандомные. Проблема только в том, что принцип генерации совсем разный и нужно именно чтобы в виндах работало.
Ребутнулся обратно в винды - ничего не изменилось. В чём дело?
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

Elven`
Нович0к
Нович0к
Сообщения: 11
Зарегистрирован: 04.05.2010

#2 Сообщение 20.08.2010, 23:57

Код: Выделить всё

#include <stdio.h>
#include <windows.h>

int main()
{
	struct _SYSTEMTIME sTime;
	GetSystemTime(&sTime);
	srand(sTime.wMilliseconds);
	printf("%d",rand());
	return 0;
}
Более мене random()-ные,т.к. берутся мили секунды.

Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#3 Сообщение 20.08.2010, 23:59

Они и так должны быть рандомные, однако они закономерны. Суть не в миллисекундах, ведь у меня всю жизнь работал и такой код.
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#4 Сообщение 21.08.2010, 01:53

NiGHt-LEshiY
Хороший рандом - рандом с надёжного (не логирующего) сервера рандомайзера в нете... локальный рандом уже будет только лишь псевдо-рандомным (если конечно не установлено дополнительное оборудование для этого дела %) )

Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#5 Сообщение 21.08.2010, 02:24

Вы тему читаете все или нет? В крайнем случае мне плевать, насколько рандомны эти числа. Обычный rand() меня всегда устраивал, но сейчас с ним происходит что-то не то.
Вот насколько рандомны эти числа: 0 3 6 9 12 15 18 21 24 27 0 3 ...
?
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#6 Сообщение 21.08.2010, 03:56

NiGHt-LEshiY
Да знаю, знаю) Вопрос в том, какая рандомнасть тебе нужна... Ведь если рандом основан на времени, то можно и самому такой рандом реализовать (или даже лучше). Я не знаю, что случилось, возможно нужно почиать доку по rand (а лучше посмотреть програмную реализацию)... Можно также полазить в настройках компилятора/дебагера (было у меня один раз - дебагер умел перехватывать рандом и была галочка "случайные числа всегда одинаковые" включена).
У меня сейчас нету времени посмотреть как rand считается...

Добавлено спустя 9 минут 17 секунд:
http://forum.shelek.ru/index.php/topic,15339.0.html

Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#7 Сообщение 21.08.2010, 12:45

MOZGIII
Мне нужен ровно такой рандом, как в rand().
1. Дело тут не в компиляторе. Я пробовал так же в Code::Blocks, а там MinGW(GCC). Пробовал компилировать и Intel C++ Compiler в студии. И даже поднимал виртуалку с дебианом и компилил чистым gcc - та же фигня. Но если не запускать Win вообще, а грузануться в Linux и компильнуть напрямую оттуда - всё шикарно.
2. Дело не в системном таймере, т.к. время в секундах он отдает правильное.

Добавлено спустя 1 час 17 минут 37 секунд:
Проблема исчезла так же неожиданно, как и появилась. Венда такая венда...
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

Закрыто