【问题标题】:Generating very large random numbers in c++在 C++ 中生成非常大的随机数
【发布时间】:2016-05-18 16:03:12
【问题描述】:

我正在使用一种算法,并希望使用一些非常大的随机数对其进行一些统计。我希望生成的数字来自区间 [2^255, 2^256],但它相当于在 [0,2^255] 中生成一个数字。

我正在使用 C++,但我对编程非常陌生,只知道基础知识。这甚至是合理的事情吗(就内存和计算能力而言)?我看过其他关于 2^32 和 2^64 的帖子,但还没有发现这么大的东西。我将对这些数字进行的唯一计算是比较、除法和减法。

如果是这样,我将如何编写代码来完成这样的任务?

【问题讨论】:

  • “这样的任务”——任务的哪一部分?目前这是一个非常广泛的问题......
  • 您需要实际的整数值,还是近似值可以?如果近似值可用,则应使用双精度数来处理它,否则您需要一个任意精度的数字库。 stackoverflow.com/questions/310276/…
  • 你会使用什么样的数据类型来处理这么大的数字?
  • random number functions in the Standard Library 有很多种。你评估过这些吗?如果您为您的问题使用正确的数字,例如生成 64 位的纯随机数据且分布均匀,您可以将多个较小的随机数连接在一起以构建一个更大的随机数。
  • “这是否合理”——是的,密码学库需要如此大的随机数作为课程的标准。但是,他们使用特殊的数学库来处理这个范围。

标签: c++ random


【解决方案1】:

这项任务本身非常简单。最困难的部分可能只是选择如何表示你的大数。目前,我们假设一个包含 4 个unsigned long long 的数组(每个数组都保证至少包含 64 位,因此 4 必须至少为 256 位)。

struct big_num { 
    unsigned long long data[4];
};

big_num gen_random() { 
    big_num ret;
    std::mt19937_64 gen;

    for (int i=0; i<4; i++)
        ret[i] = gen();
    return ret;
}

从这里可能很明显,大小几乎无关紧要。我们基本上只是产生一些随机位(一次 64 个)并将它们推入某种容器,然后返回容器。

将这个基本概念与您选择的不同“容器”一起使用的唯一技巧是获取容器的位表示,因此您可以操作单个 longlong long(或其他)组件用于存储价值。由于 C 或 C++ 中内置的最大类型(保证是)是 64 位,因此几乎可以保证,任何存储大于该数字的方式都可以通过存储一些可以用 a 表示的较小对象来实现本机类型。

【讨论】:

    猜你喜欢
    • 2011-07-23
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 2018-10-02
    • 2014-06-10
    • 1970-01-01
    • 2017-09-07
    • 2011-12-16
    相关资源
    最近更新 更多