我正在使用算法,并希望使用一些非常大的随机数对其进行一些统计。我希望生成的数字来自区间[2 ^ 255,2 ^ 256],但它相当于在[0,2 ^ 255]中生成一个数字。
我正在使用C ++,但我对编程很新,只知道基础知识。这甚至是一个看似合理的事情(在内存和计算能力方面)?我已经看到其他帖子处理2 ^ 32和2 ^ 64,但没有找到任何相当大的东西。我将对这些数字进行的唯一计算是比较,除法和减法。
如果是这样,我将如何编写代码来完成这样的任务?
答案 0 :(得分: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个)并将它们推入某种容器,然后返回容器。
使用这个基本概念与另一个&#34;容器&#34;您选择的是获取容器对位的表示,因此您可以操作用于存储值的单个long
,long long
(或其他)组件。由于C或C ++中内置的最大类型(保证是64位),因此可以通过存储一些可以存储的数量较小的对象来保证存储大于该数字的任何方式。用本地类型表示。