生成一个长度为25的随机数

时间:2012-01-25 20:43:35

标签: c random

例如:1589745896214758962147852。

这个问题我已经暂时搁置了一段时间。 有什么可能的方法? 什么是最佳做法?

4 个答案:

答案 0 :(得分:7)

您可以为每个数字调用随机数生成器25次 - 如果您希望将其作为字符串,则可以很简单。

如果您没有可用的随机数功能,则可以轻松实现。 enter image description here

http://xkcd.com/221/

答案 1 :(得分:1)

您必须处理一个字符串以保存您的号码。

因为签名的长多分为-9223372036854775808且最大为9223372036854775807。

1589745896214758962147852更长。

答案 2 :(得分:1)

这是一个很好的问题......

您可以使用OpennSsl BIGNUM。

这是一个简单的虚拟示例。

#include <stdio.h>
#include <openssl/bn.h>

int main(int argc, char **argv)
{
    BIGNUM *fat;
    BN_ULONG a, f;
    char *resp;
    int i;

    fat = BN_new();

    for (i = 1; i < argc; i++) {

        f = atoll(argv[i]); 

        BN_dec2bn(&fat, "1"); 
        for (a = 2; a <= f; a++) {
            BN_mul_word(fat, a);
        } 

        resp = BN_bn2dec(fat); 

        printf("Fatorial of %s = %s\n", argv[i], resp);
    }
    return 0;
 }

我刚刚发现了一个更好的例子:

#include <stdio.h>
#include <openssl/bn.h>

int main(int argc, char **argv)
{
    BIGNUM *fat;
    char *resp = NULL;

    fat = BN_new();

    BN_generate_prime(fat, 80, 1, NULL, NULL, NULL, NULL);

    resp = BN_bn2dec(fat);

    printf("Big Random Value: %s\n", resp);

}

答案 3 :(得分:0)

你的问题定义不明确(在撰写本文时)。

如果您只需要25位数字,那么您可以简单地迭代25次,获得0到9之间的随机数,并将它们编译成一串数字字符。

如果它必须是25位数字(即10 25 &lt; = r&lt; = 10 26 -1)而不是25个随机数字,那么第一个数字必须&gt; = 1(没有前导零)。

如果你需要这些数字来表示一个整数值,你可以在其上执行算术运算,而不是一串数字,那么你将在任何可能的平台上运行C的内置数据类型。将需要至少85位(10 25 / log(2))。

您可以通过将从标准随机数生成器返回的位连接到字节数组来构建85位表示。如果使用标准C库rand()函数,请检查实现的RAND_MAX值;一些实现只生成16位,因此需要注意连接它们,因为它可能不是随机位的整个字。但是,要算术操作这样的数字,你必须创建算术函数来做(或使用“bignum”库)。