rand() 函数是否总是使用相同的种子产生相同的结果?

Far*_*raz 1 c random random-seed

我正在尝试在C 中实现一组编码和解码隐写功能,其中我使用 rand() 将我的数据随机散布在一个数组中。

我使用 rand 来计算一个随机索引,如下所示:

unsigned int getRandIndex(int size) {
  return ((unsigned)(rand() * 8)) % size;
}
Run Code Online (Sandbox Code Playgroud)

我像这样播种 rand:

unsigned long seed = time(NULL);
srand(seed);
Run Code Online (Sandbox Code Playgroud)

我将种子和我的数据一起作为包含校验和和长度的标头的一部分。

我遇到的问题是,在解码时,当我用从数据中解码的种子再次为 rand 函数播种时,rand() 往往会产生最轻微的变化,如下所示:

Index at encode:                  | Index at decode:
---------------------------------------------------------------------
.
.
.
At:                        142568 | At:                        142568
At:                        155560 | At:                        155552
                               --                                  --
At:                        168184 | At:                        168184
.
.
.
Run Code Online (Sandbox Code Playgroud)

弄乱我的解码数据。

这是 rand() 函数的限制吗?我 100% 确定种子正在逐位正确解码,因为我已经验证过。

Eri*_*hil 5

C 2018 7.22.2.2 2 说:

srand函数使用参数作为一个新的伪随机数序列的种子,该序列将被后续调用返回rand。如果srand然后使用相同的种子值调用,则伪随机数序列应重复。

这并没有明确说明在程序的不同执行中顺序是相同的,但我认为这是理解的。但是,它不会扩展到不同的 C 实现,包括那些因链接到不同版本的 C 标准库而产生的实现。