在C / C ++中获取大的随机数

时间:2015-01-23 17:47:52

标签: c++ c random unsigned-long-long-int

标准rand()函数给出的数字对我来说不够大:我需要unsigned long long个。我们如何获得非常大的随机数?我尝试修改一个简单的哈希函数,但它也,运行时间太长,从不产生小于1e5的数字!!

6 个答案:

答案 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()