Проблемы с отбором генератор псевдослучайного числа несколько раз?

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

Например, у клиентов возникла ошибка связи с проектом, над которым я работал. Мы искали код, чтобы исправить возможные ошибки. Одна ошибка включала ошибку ASIC в микропроцессоре PIC, а ошибки чипа предоставили обходной путь, который мы реализовали. Затем один из моих коллег прошел крайние меры, чтобы воспроизвести ошибку, чтобы он мог утверждать, что проблема нашего клиента, вероятно, была решена.

Это не было.

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

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

Похоже, ваше рабочее место слишком далеко на конце спектра «ничего не воспроизводить», и это позор, когда небольшая дополнительная работа может привести к созданию гораздо более надежного программного обеспечения. В этом посте я утверждал, что другой конец спектра не так уж и велик, поэтому я постараюсь добиться чего-то промежуточного.

5
задан a038c56f 10 June 2009 в 17:26
поделиться

4 ответа

Each time you call a pseudo-random number generator function, the generator takes some internal state and produces a pseudo-random number and a new internal state. The algorithm for transforming the internal state is carefully chosen so the output appears random.

When you seed the random number generator, you're basically setting this internal state. If you reset the internal state to some predictable value, you'll lose the appearance of randomness.

For example, a popular, simple RNG is a linear congruential generator. Numbers are generated like this:

X[n+1] = (a X[n] + c) mod m

In this case, X[n+1] is both the result and the new internal state. If you seed the generator every time as you suggest above, you'll get a sequence that looks like this:

{(ab + c) mod m, (a(b+1) + c) mod m, (a(b+2) + c) mod m, ...}

where b is your seed_base. This doesn't look random at all.

6
ответ дан 14 December 2019 в 04:46
поделиться

Если ваше семя предсказуемо, а оно здесь, поскольку вы просто увеличиваете его, вывод rand () также будет предсказуемым.

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

Почти на каждой платформе есть лучший способ генерировать случайные числа, чем rand ().

1
ответ дан 14 December 2019 в 04:46
поделиться

Ну, это дополнительная обработка, которая не требуется.

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

Я не думаю, что ваш метод более случайный, чем этот.

1
ответ дан 14 December 2019 в 04:46
поделиться

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

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

Хотя ваше решение приемлемо, ваши числа будут не более случайными, чем один раз в мире. srand обычно не должен входить в конструктор. Если вы хотите поддерживать случайные числа, укажите один раз при запуске программы и забудьте об этом.

0
ответ дан 14 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: