Редактировать: я получил это работать (см. В ответах ниже) в VS2012, но он все еще не работает должным образом в Xcode.
Я пытаюсь уменьшить число без знака long до int в C ++, но потеря данных кажется неизбежной:
unsigned long bigInt= randomBigNumber;
int x = 2;
Затем я передаю большое число в функцию, которая принимает подписанные числа:
void myFunc(bigInt/(ULONG_MAX/x));
Если randomBigNumber — это повторяющееся случайное число — например, в цикле for — я полагаю, что я должен получить относительно равномерно распределенное число единиц и нулей, но я получаю только нули.
Как я могу преуменьшить это, чтобы получить некоторые?
Благодарю.
ре
» Я получаю только нули
Это потому, что вы делитесь на довольно большое число. Если диапазон генератора случайных чисел меньше этого большого числа, вы можете получить только нули.
ре
» Как я могу преуменьшить это, чтобы получить некоторые?
Ты можешь сделать
myFunc(bigInt % 2);
Однако есть влияние на случайность. По крайней мере, из-за несовершенных генераторов младшие значащие биты псевдослучайного числа, вероятно, были бы намного меньше, чем совершенно случайными. Таким образом, кроме эффективности, вам может быть лучше, например, делать.
myFunc((bigInt / 8) % 2);
если вы заинтересованы в хорошей случайности. Все зависит от генератора, конечно. И есть другие более сложные методы для улучшения случайности.
Я рассчитал один способ:
unsigned long bigInt = randomBigNumber;
unsigned long x = ULONG_MAX / 2;
myFunc(bigInt / x);
Это сработало для меня. Я был в состоянии генерировать ноль и единицы.
Примечание: я могу заставить это работать только в VS2012, но не Xcode. Зачем?