当前位置: 首页 > 知识库问答 >
问题:

在C/C中获取大随机数

司寇高峯
2023-03-14

标准< code>rand()函数给出的数字对我来说不够大:我需要< code>unsigned long long的数字。我们如何得到非常大的随机数?我试着修改一个简单的散列函数,但是它太大,运行时间太长,而且从来不会产生小于1e5的数字!!

共有3个答案

丁雅惠
2023-03-14

如果您只想从rand()返回的值生成无符号long long,而不关心结果的特征,请考虑以下函数,该函数必须与编译器版本和平台无关(因为没有使用“幻数”):

// 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

司徒英卓
2023-03-14
匿名用户

这是一个可移植的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;
}

解释:< code>rand()返回0到< code>RAND_MAX之间的整数,而< code>RAND_MAX只能保证至少为32,767 (15个随机位)。< code>long long保证有64位,但可能更大。

贝财
2023-03-14

您可以很容易地用std::uniform_int_distribution

简单示例代码(取自此处,修改为使用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';
}

请注意,这里为演示目的而做的梅森图的播种并不完美,例如,请看这里。

 类似资料:
  • 本文向大家介绍C#中获取、生成随机数的三种方法,包括了C#中获取、生成随机数的三种方法的使用技巧和注意事项,需要的朋友参考一下 随机数的定义为:产生的所有数字毫无关系. 在实际应用中很多地方会用到随机数,比如需要生成唯一的订单号. 在C#中获取随机数有三种方法: 一.Random 类 Random类默认的无参构造函数可以根据当前系统时钟为种子,进行一系列算法得出要求范围内的伪随机数. 这种随机数可

  • 本文向大家介绍C++常见获取随机数的方法小结,包括了C++常见获取随机数的方法小结的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C++常见获取随机数的方法。分享给大家供大家参考,具体如下: 方法一: 使用 rand 函数可以获取,如下。 随机数大小是在0到RAND_MAX,值为2147483647,它是在stdlib中定义的,如果我们希望在某个范围内,可以使用 % 结合 / 来实现。 但

  • 我想使用c生成0-2^64范围内的非常大的随机数。我使用了rand()函数,但它没有生成非常大的数字。任何一个都可以帮助吗?

  • 我想用骰子做一个游戏,我需要在其中加入随机数(以模拟骰子的侧面。我知道如何在1到6之间进行)。使用 不能很好地工作,因为当我运行程序几次时,我得到的输出是: 所以我想要一个每次都会生成不同随机数的命令,而不是连续5次生成相同的随机数。是否有命令可以执行此操作?

  • 主要内容:随机数的本质,重新播种,生成一定范围内的随机数,连续生成随机数在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌。 在C语言中,我们一般使用 <stdlib.h> 头文件中的 rand() 函数来生成随机数,它的用法为: int rand (void); void 表示不需要传递参数。 C语言中还有一个 random() 函数可以获取随机数,但是 random() 不是标准函数,不能在 VC/VS 等编译器通过

  • 问题内容: 如何在或中按照正态分布轻松生成随机数? 我不想使用Boost。 我知道Knuth详细讨论了这个问题,但是我现在没有他的书。 问题答案: 有许多方法可以从常规RNG生成高斯分布数。 该箱穆勒变换是常用的。它会正确产生具有正态分布的值。数学很简单。您生成两个(均匀)随机数,然后对它们应用公式,就得到两个正态分布的随机数。返回一个,并将另一个保存为下一个随机数请求。