3

Я тестирую некоторый код с некоторыми случайными числами, сгенерированными с текущим временем в качестве начального числа, используя

srand(time(0)) 

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

Кроме того, у меня нет root-доступа, поэтому я не могу установить дату / время с помощью команды date или ее программного эквивалента.

5 ответов5

3

Используйте faketime .

faketime '2013-03-14 08:25:30' ./your_program

Если вы не являетесь пользователем root, вы можете просто загрузить программу вручную из своего дистрибутива. Например, если вы используете производную Debian, которая использует APT:

aptitude download faketime
mkdir /tmp/faket/ dpkg-deb --extract faketime*.deb /tmp/faket
cp /tmp/faket/usr/bin/faketime ~
cp /tmp/faket/usr/lib/faketime/* ~
cd
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:."
./faketime '2013-03-14 08:25:30' ./your_program
0

При использовании ntpd (проверьте со service ntpd status):

service ntpd stop
date --set="23 June 1988 22:22:55"

Когда сделано:

ntpd -gq
service ntpd start
0

Без корневого доступа вы не можете установить время на сервере. Кроме того, когда вы говорите: «Я хотел бы получать одно и то же случайное число каждый раз, когда я его запускаю». Вы действительно ставите себя в трудное положение возможностей.

Вы не можете получить одно и то же случайное число несколько раз при запуске приложения / сценария / и т.д. поэтому лучшее, что вы можете сделать, это сгенерировать случайное число, а затем использовать его статически каждый раз, когда вы запускаете приложение для тестирования.

0

Без корневого доступа вы не сможете делать то, что просите; если, возможно, вы не сможете создать виртуальную машину (но тогда вам нужно быть пользователем root на виртуальной машине).  Почему бы не подделать это?

time_t time(time_t *dummy)
{
    return(atoi(getenv("FAKE_TIME")));
}

Другими словами, выберите значение, которое вы хотите использовать в качестве начального числа для всего вашего тестирования, и присвойте его переменной среды FAKE_TIME .  Измените код обратно, когда вы закончите тестирование.

Очевидно, это всего лишь пример; Вы можете сделать логику более сложной, если хотите.  (Но если вы запускаете генератор случайных чисел только один раз за вызов программы, то, вероятно, в этом нет необходимости.)

0

Передайте начальное значение как элемент конфигурации, из командной строки или из файла конфигурации.

Это звучит для меня крайне странно - упрямо получать случайный начальный генератор из текущего времени, а затем форсировать его.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .