我知道要生成随机长数,我在Java中执行以下步骤:
Random r = new Random();
return r.nextLong();
在C ++中,这段代码的等价物是什么?像这样?
return (long)rand();
答案 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);