生成随机长数

use*_*547 7 c++

我知道要生成随机长数,我在Java中执行以下步骤:

Random r = new Random();
return r.nextLong();
Run Code Online (Sandbox Code Playgroud)

在C++中,这段代码相当于什么?像这样?

return (long)rand();
Run Code Online (Sandbox Code Playgroud)

Ton*_*roy 13

<cstdlib>提供int rand().您可能需要查看手册页.如果long大于系统上的int,则可以调用rand()两次并将第一个值放在高位字中.

#include <cstdlib>

long lrand()
{
    if (sizeof(int) < sizeof(long))
        return (static_cast<long>(rand()) << (sizeof(int) * 8)) |
               rand();

    return rand();
}
Run Code Online (Sandbox Code Playgroud)

(long不可能与int的大小相同或者是int的两倍,所以如果理论上不完美则这是实用的)

检查你的文档rand()虽然.它不是一个伟大的发电机,但对大多数事情都足够好.您将要调用srand()来初始化随机数生成系统.其他人评论说Windows不会返回sizeof(int)随机位,所以你可能需要调整上面的内容.


ev-*_*-br 10

使用boost随机库可以使用(伪)随机数为您节省相当令人讨厌的惊喜

  • "使用提升解决<*>问题"成为任何类型问题的标准答案:P. (6认同)
  • 与Javascript的"使用jQuery"答案相同:) (2认同)

Kla*_*aim 6

首先,你知道在当前的标准C++中没有随机库.实际上有一个,但它在名为TR1的sperate命名空间中可用,因为它是2003年完成的技术报告的结果.它将在下一个标准的标准库中提供(如果一切顺利,将在明年出现).

因此,如果你有一个最近的编译器(VS2008或持续版本的GCC),你可以访问std :: tr1 :: random库; 如果你有一个编译器实现下一个标准的部分,那么你有std :: random.

如果您无权访问该库,则可以在boost库中找到一个实现:http://www.boost.org/doc/libs/1_44_0/doc/html/boost_random.html

现在在所有情况下,获取随机数的方式与所有相同的库(来自boost doc)相同:

boost::mt19937 rng;                 // produces randomness out of thin air
                                    // see pseudo-random number generators
boost::uniform_int<> six(1,6);      // distribution that maps to 1..6
                                    // see random number distributions
boost::variate_generator<boost::mt19937&, boost::uniform_int<> >
         die(rng, six);             // glues randomness with mapping
int x = die();                      // simulate rolling a die
Run Code Online (Sandbox Code Playgroud)


Uli*_*ter 3

便携式黑客:

长r=0;
for (int i = 0; i < sizeof(long)/sizeof(int); i++)
{
    r = r << (sizeof(int) * CHAR_BITS);
    r |= 兰特();
}
返回 r;

无论如何,为什么你需要一个随机长呢?

  • 我花了很大一部分工作时间进行蒙特卡洛模拟,我见过很多灾难,其中问题实际上是由于随机数生成器不好或对其进行“简单”黑客攻击造成的。坦率地说,我想说你的建议离一个大禁忌太近了。 (2认同)