生成随机长数

时间:2010-09-08 06:49:05

标签: c++

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

Random r = new Random();
return r.nextLong();

在C ++中,这段代码的等价物是什么?像这样?

return (long)rand();

7 个答案:

答案 0 :(得分: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();
}

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

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

答案 1 :(得分:10)

使用boost random library可以使用(伪)随机数

为您节省相当令人讨厌的惊喜

答案 2 :(得分:6)

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

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

如果您无权访问该库,则可在升级库中使用实现: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

答案 3 :(得分:3)

便携式黑客:

long r = 0;
for (int i = 0; i < sizeof(long)/sizeof(int); i++)
{
    r = r << (sizeof(int) * CHAR_BITS);
    r |= rand();
}
return r;

为什么你还需要一个随机长的?

答案 4 :(得分:1)

这是我使用的方法。它返回范围[0,2 ^ 64-1]中的数字。

unsigned long long unsignedLongLongRand()
{
    unsigned long long rand1 = abs(rand());
    unsigned long long rand2 = abs(rand());
    rand1 = rand1 << (sizeof(int)*8);   
    unsigned long long randULL = (rand1 | rand2);   
    return randULL;
}

答案 5 :(得分:1)

此函数的作用类似于rand()并使用Unsigned Long Type:

unsigned long _LongRand ()
{

unsigned char MyBytes[4];
unsigned long MyNumber = 0;
unsigned char * ptr = (unsigned char *) &MyNumber;

MyBytes[0] = rand() % 256; //0-255
MyBytes[1] = rand() % 256; //256 - 65535
MyBytes[2] = rand() % 256; //65535 -
MyBytes[3] = rand() % 256; //16777216

memcpy (ptr+0, &MyBytes[0], 1);
memcpy (ptr+1, &MyBytes[1], 1);
memcpy (ptr+2, &MyBytes[2], 1);
memcpy (ptr+3, &MyBytes[3], 1);

return(MyNumber);
}

答案 6 :(得分:0)

C ++ 11提供了<random>库。要生成long,您可以使用类似以下代码:

#include <random>
#include <climits>

...

std::default_random_engine generator;
std::uniform_int_distribution<long> distribution(LONG_MIN,LONG_MAX);
long result = distribution(generator);