我怎样才能安全地放下这个



编辑:我在VS2012中得到了这个工作(见下面的答案),但它仍然不能在Xcode中正确向下转换。

我试图在c++中从unsigned long向下转换为int,但数据丢失似乎不可避免:

unsigned long bigInt= randomBigNumber;
int x = 2;

然后将一个大数传递给接受有符号整型的函数:

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

如果randombignnumber是一个重复的随机数——比如在for循环中——我想我应该得到一个相对均匀分布的1和0的数量,但我得到的只是0。

我怎样才能把这个放下来得到一些呢?

谢谢。

Re

我只得到0

那是因为你除以的是一个相当大的数。如果随机数生成器的范围小于这个大数,则只能得到0。


Re

我怎么才能把这个向下转换,以便得到一些?

你可以做

myFunc(bigInt % 2);

然而,这对随机性有影响。至少在过去,由于不完善的生成器,伪随机数的最低有效位可能远远不是完全随机的。因此,除了效率之外,你可能还不如这样做:

myFunc((bigInt / 8) % 2);

如果你对好的随机性感兴趣。当然,这都取决于生成器。还有其他更复杂的技术可以提高随机性。

我想到了一个办法:

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

这对我有用。我可以生成0和1。注意:我只能让这个工作在VS2012,但不是Xcode。为什么?

最新更新