2010-09-08 36 views
4

随机长的数字,我们知道,来生成随机数长我们下面在Java中生成C++

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

步骤是什么将相当于该代码在C++的?喜欢这个?

return (long) rand(); 
+2

“我们知道,来生成随机数长我们下面的步骤”是吗?用哪种语言? – sbi 2010-09-08 06:53:29

+0

@sbi:代码片段用于Java(因为任何经验丰富的Java程序员都可以告诉你),但是,是的,你正确地指出OP可能更直接地陈述这一点。 – 2010-09-08 06:59:21

+0

看起来像Java或C# - 太晚:) – Klaim 2010-09-08 06:59:47

回答

3

便携式黑客:

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

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

+1

在Visual Studio中这不是一个好主意,RAND_MAX是2^15-1,在最后的数字中为0。 – jbernadas 2010-09-08 06:55:53

+0

要完美移植,请始终使用'CHAR_BITS',而不是文字'8'。 – sbi 2010-09-08 06:56:11

+1

你确定你用这种方式获得的随机数字的质量吗? – 2010-09-08 06:57:14

9

使用boost random library可以节省你不少讨厌的惊喜与(伪)随机数

+6

“使用boost来解决<*>问题”成为任何类型问题的标准答案:P。 – virious 2010-09-08 08:47:15

+0

@virious:我不知道“任何问题”。这里全是关于算法的。当然,你可以编写你自己的Mersenne Twister版本,或者通过黑客标准的rand()---或者使用boost :: random(这就是三行代码)召唤难以发现的错误。 – 2010-09-08 10:16:13

+0

这只是我的感觉,一般情况下,不是在你的特定答案:)。是的,很明显boost是经常使用的非常优化的库集合。 – virious 2010-09-08 11:47:02

6

首先,你必须吨知道,在目前的标准C++没有随机库。实际上有一个,但它可以在一个名为TR1的名称空间中使用,因为它是2003年完成的技术报告的结果。它将在下一个标准的标准库中提供(如果一切顺利,则将在明年推出)。因此,如果你有最近的编译器(VS2008或持续版本的GCC),你可以访问std :: tr1 :: random库;如果你有一个编译器实现下一个标准的部分,那么你有std :: random。

如果您没有访问该图书馆,还有在Boost库可实现:http://www.boost.org/doc/libs/1_44_0/doc/html/boost_random.html

现在,在所有的情况下,要获得一个随机数的方法是一样的,因为它是完全一样的库(来自升压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 
+0

不会'使用命名空间boost :: random;'将所有'boost :: random'放入_current_命名空间中?那么编译器如何在'boost'中找到它?我错过了什么? – sbi 2010-09-08 06:58:50

+0

@sbi:使用它们都可用。 @Klaim:cstdlib呢? – 2010-09-08 07:01:25

+0

@Tony:我不明白这是怎么发生的。谨慎阐述? – sbi 2010-09-08 07:06:54

11
<cstdlib>

提供INT兰特()。你可能想看看手册页。如果long在系统上大于int,则可以调用rand()两次,并将第一个值放在高位字中。

#include <cstdlib> 

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

    return rand(); 
} 

(这是非常不可能的长既不是相同或双倍int的长度,所以这是实际的,如果不是理论上完美)

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

+0

我认为'static_cast '应该只包含第一个'rand()',对吧?当前版本通过'sizeof(int)* 8'来移位int,这基本上是一个“识别函数”,即你再次获得相同的值。 – bluenote10 2015-08-03 13:59:20

+0

@ bluenote10:很好发现...会修复。干杯。 – 2015-08-03 15:24:32

+0

Java long总是64位。 只要在大多数系统上只有32位的C++,我宁愿使用一个函数long long llrand()来代替。 – Kaiserludi 2016-09-29 15:40:15

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; 
} 
1

这个功能就像兰特(),并使用无符号长型:

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); 
}