Как я могу безопасно прекратить это?

Редактировать: я получил это работать (см. В ответах ниже) в VS2012, но он все еще не работает должным образом в Xcode.

Я пытаюсь уменьшить число без знака long до int в C ++, но потеря данных кажется неизбежной:

unsigned long bigInt= randomBigNumber;
int x = 2;

Затем я передаю большое число в функцию, которая принимает подписанные числа:

void myFunc(bigInt/(ULONG_MAX/x));

Если randomBigNumber — это повторяющееся случайное число — например, в цикле for — я полагаю, что я должен получить относительно равномерно распределенное число единиц и нулей, но я получаю только нули.

Как я могу преуменьшить это, чтобы получить некоторые?

Благодарю.

0

Решение

ре

» Я получаю только нули

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


ре

» Как я могу преуменьшить это, чтобы получить некоторые?

Ты можешь сделать

myFunc(bigInt % 2);

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

myFunc((bigInt / 8) % 2);

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

1

Другие решения

Я рассчитал один способ:

unsigned long bigInt = randomBigNumber;
unsigned long x = ULONG_MAX / 2;
myFunc(bigInt / x);

Это сработало для меня. Я был в состоянии генерировать ноль и единицы.
Примечание: я могу заставить это работать только в VS2012, но не Xcode. Зачем?

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector