gpt4 book ai didi

c - 为什么 srand 创建相同的数字?

转载 作者:太空宇宙 更新时间:2023-11-04 03:08:54 26 4
gpt4 key购买 nike

我用 c 语言编写了一个随机创建矩阵的程序。它创建一个像这样的字符串 (3,-6,2;5,2,-9;-8,20,7)。 “;”切割每一行和一个“,”每一列。现在我写了一个 Rust 程序,可以进行矩阵加法或乘法运算。我这样调用它:
./matrix ./test 3 3 "*"./test 3 3

./matrix 调用我的 Rust 程序,我给它 3 个参数。 (矩阵 1、运算符、矩阵 2)它有效并且计算很好,但矩阵 1 和 2 始终相等。我认为这是因为我根据时间使用 srand 并且因为我同时调用它它创建了两次相同的时间。我还测试了 Matrixrandomizer,但没有将它包含在我的 rust 调用中,它总是创建不同的矩阵。

在这里你可以看到我的c代码。

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

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

if(argc < 3) {
printf("Es fehlen Argumente");
}
char matrix[100] = "";

int r, c;
r = atoi(argv[1]);
c = atoi(argv[2]);

if(r > 0 && c > 0) {
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++){
if(j == c - 1) {
int test = (1+rand()%9);
char buffer[50];
sprintf(buffer, "%d", test);
strcat(matrix, buffer);
}
if(j < c - 1){
int test = (1+rand()%9);
char buffer[50];
sprintf(buffer, "%d", test);
strcat(matrix, buffer);
strcat(matrix, ",");
}

}
if(i != r - 1) {
strcat(matrix, ";");
}
}
}
printf("%s", matrix);
}

最佳答案

srand 想要一个种子作为参数。对于给定的种子,随机序列将是相等的。因此,如果您在很短的时间内以 time(NULL) 为参数调用 srand 两次,则很有可能会给出相同的种子。

使用time(NULL) 作为种子是确保在正常情况下每次运行程序时都有不同输出的好方法。但在这种情况下,您需要添加更多内容。一种方法是添加一个额外的参数作为 salt(从哈希中借用的术语),如下所示:

int salt = atoi(argv[3]);
srand(time(NULL) + salt);

然后确保使用不同的参数调用程序,如下所示:

./test 3 3 546

这里的546是你选择的号码,两次调用应该是不同的。我建议让它们大不相同。如果它们仅相差一个,则如果时钟在两次调用之间更改为秒,您可能会遇到相同的问题。

另一种方法是使用 getpid() 作为盐。如果您不愿意更改应该发送给程序的参数数量,这可能更可取。

关于c - 为什么 srand 创建相同的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58580795/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com