相关疑难解决方法(0)

15
推荐指数
2
解决办法
7万
查看次数

为什么 rand() 的使用被认为是不好的?

我听到一些人说,rand()即使在使用srand()获得种子后,使用也很糟糕。为什么呢?我想知道事情是如何发生的......还有另一个问题很抱歉......但是有什么替代方法呢?

c++ random lcg

7
推荐指数
3
解决办法
5489
查看次数

18万亿投掷硬币,我哪里出错了?

为什么以下C代码在我的桌面和服务器上给出了不同的结果,两者都运行类似的Linux版本?

它在18万亿投币中找到了行序列中最长的同一侧.[见Iain M. Banks的科幻小说考虑Phlebas.]

在服务器上,经过15.7万亿投币(它仍然在运行)之后,到目前为止,行序列中最长的同一侧只有29个.因为2^44 = 17,592,186,044,416,我希望最长的同一侧序列在40到40年代的中间位置,在完成所有18万亿之后,可能还有44个.

在仅仅47亿次投掷硬币之后的桌面上,最长的序列已经是31,从那以后2^31 = 2,147,483,648,这听起来是正确的.

那么为什么我在15.7万亿投币后只在服务器上获得了29个序列,但在我的桌面上只有47亿的31个序列?

Modulo偏见是我的第一个想法.RAND_MAX在桌面和服务器上是相同的,2,147,483,647(32位签名长).所以rand()函数会给我一个数字0 <= rand() <= 2,147,483,647.0是偶数,2,147,483,647是奇数,所以除非我非常误以为我int rand_num = (rand() % 2);的代码行没有引入模偏差.

我知道C标准库的伪随机数生成器不适合加密.当然,这不可能是一个因素,当然产生非常长,零和一系列的序列.可以吗?

这是来源:

在两台机器上编译使用: gcc -O3 -o 18TCT 18TrillionCoinTosses.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char* argv[])
{
    srand(time(NULL));

    int current_seq = 0;
    int longest_seq = 0;
    int prev_rand_num = -1;

    long long i = 0;
    long long total = 18000000000000;

    // To …
Run Code Online (Sandbox Code Playgroud)

c random

3
推荐指数
1
解决办法
269
查看次数

srand 是加密垫的可靠来源吗?

我希望加密音频软件插件上的许可证密钥。许可证密钥完整性的最大风险是小型破解者反编译代码并寻找加密密钥。我的解决方案是在代码中存储任意数字并将其提供给一种算法,该算法将混淆加密密钥,同时仍然允许我在项目之间区分密钥(我是自由职业者)。

我的问题是 - 每次播种 C++ 随机数生成器都会创建相同的伪随机加密密钥,还是在运行、库等之间会有所不同。如果它在操作系统之间有所不同,那很好,我只需要它在同一台计算机上的 SDK 和托管软件之间没有区别。

c++ random encryption license-key encryption-symmetric

0
推荐指数
1
解决办法
77
查看次数