标准rand()
函数给出的数字对我来说不够大:我需要unsigned long long
个。我们如何获得非常大的随机数?我尝试修改一个简单的哈希函数,但它也大,运行时间太长,从不产生小于1e5的数字!!
答案 0 :(得分:16)
您可以使用std::uniform_int_distribution<unsigned long long>
轻松完成此操作。
简单示例代码(取自here,已修改为使用unsigned long long
):
#include <random>
#include <iostream>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<unsigned long long> dis(lowerBorder, upperBorder);
for (int n=0; n<10; ++n)
std::cout << dis(gen) << ' ';
std::cout << '\n';
}
请注意,此处为演示目的而进行的mersenne twister播种并不完美,例如参见here。
答案 1 :(得分:8)
这是一个便携式C99解决方案,它返回一个随机的64位数字:
unsigned long long llrand() {
unsigned long long r = 0;
for (int i = 0; i < 5; ++i) {
r = (r << 15) | (rand() & 0x7FFF);
}
return r & 0xFFFFFFFFFFFFFFFFULL;
}
说明:rand()
返回0到RAND_MAX
范围内的整数,RAND_MAX
仅保证至少为32,767(15个随机位)。 long long
保证有64位但可能更大。
答案 2 :(得分:2)
如果你只想从rand()返回的值中产生unsigned long long并且不关心结果的特性,请考虑以下函数,该函数必须是编译器版本和平台无关的(因为没有&#34;幻数& #34;使用):
// this header has RAND_MAX value
#include <stdlib.h>
// and this header has ULLONG_MAX
#include <limits.h>
unsigned long long ullrand()
// Produces pseudo-random numbers from 0 to ULLONG_MAX
// by filling all bits of unsigned long long integer number
// with bits of several "small" integer numbers generated by rand()
{
unsigned long long myrndnum = 0; // at the beginning just zero
unsigned long long counter = ULLONG_MAX; // at the beginning we have all bits set as 1
// ... and while at least one bit is still set to 1
while(counter > 0) {
myrndnum = (myrndnum * (RAND_MAX + 1)) + rand(); // fill some bits from rand()
counter /= (RAND_MAX + 1); // decrease number of 1-bits in counter
}
// Return the result
return myrndnum;
}
但是如果你想要一些具有某些预定特征的随机数序列,你应该查看一些特定的指南或数学书籍。例如。 https://www.gnu.org/software/gsl/manual/html_node/Random-number-generator-algorithms.html
答案 3 :(得分:0)
你没有要求特定的操作系统,这里的答案非常好,但在Linux上(也可能在其他操作系统上)你也可以从随机设备上读取。
示例:
#include <stdio.h>
#include <assert.h>
#define RANDDEV "/dev/urandom"
unsigned long long bigrand(void) {
FILE *rdp;
unsigned long long num;
rdp = fopen(RANDDEV, "rb");
assert(rdp);
assert(fread(&num, sizeof(num), 1, rdp) == 1);
fclose(rdp);
return num;
}
写在手机上,可能有bug。 :P
答案 4 :(得分:0)
您还可以使用加强库(取自link):
#include <ctime> // std::time
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/linear_congruential.hpp>
#include <boost/random/uniform_real.hpp>
#include <boost/random/variate_generator.hpp>
#include <boost/generator_iterator.hpp>
int main()
{
long long my_min = 1;
long long my_max = 1e5;
boost::mt19937 generator(static_cast<unsigned int>(std::time(0)));
boost::variate_generator<boost::mt19937&, boost::uniform_real<> >
die_gen(generator, boost::uniform_real<> (my_min, my_max));
boost::generator_iterator<boost::variate_generator<boost::mt19937&, boost::uniform_real<> > > die(&die_gen);
std::cout<<"Generated random numbers: \n";
for (int i=0; i <10 ; i++)
{
std::cout<< static_cast<long long>(*die++) << std::endl;
}
return 0;
}
答案 5 :(得分:-1)
试试这个:
long N=1000000;
long randNumber;
for(long i=0;i<N;i++)
randNumber=i+rand()