C 洗牌
这段代码应该做的是洗牌一个数组,尽管如此,每次我在一个数组上运行它,我都会得到相同的“洗牌”数组(当然,通过输入相同的未洗牌数组),我认为C 洗牌,c,arrays,random,shuffle,C,Arrays,Random,Shuffle,这段代码应该做的是洗牌一个数组,尽管如此,每次我在一个数组上运行它,我都会得到相同的“洗牌”数组(当然,通过输入相同的未洗牌数组),我认为srand(time(NULL))部分将确保这一点。如果不是这样,我不知道如何让它真正洗牌 总之,我需要知道为什么我的代码每次都以相同的方式洗牌数组 # include <stdio.h> # include <stdlib.h> # include <math.h> # include <time.h>
srand(time(NULL))代码>部分将确保这一点。如果不是这样,我不知道如何让它真正洗牌
总之,我需要知道为什么我的代码每次都以相同的方式洗牌数组
# include <stdio.h>
# include <stdlib.h>
# include <math.h>
# include <time.h>
int main(){
int n;
int m;
int tmp;
int i;
printf("Please input the number of elements in your array:\n");
scanf("%d", &n);
int baraja[n];
int tempbaraja[n];
for (int i = 0; i < (sizeof(baraja)/sizeof(baraja[0])); i ++){
printf("Please input the %d element of your array:\n",i);
scanf("%d",&baraja[i]);
}
printf("Unshuffled array:\n");
for (i=0;i < n;i++) {
printf(" %d \n",baraja[i]);
}
for (int i = 0; i < n; i ++){
tempbaraja[i] = baraja[i];
}
for (int i = 0; i < n; i ++){
srand(time(NULL));
m = rand() % n;
if (tempbaraja[m] == baraja[m]){
tmp = baraja[m];
baraja[m] = baraja[i];
baraja[i] = tmp;
}else{
}
}
printf("Shuffled array:\n");
for (i=0;i < n;i++) {
printf(" %d \n",baraja[i]);
}
}
#包括
#包括
#包括
#包括
int main(){
int n;
int m;
int tmp;
int i;
printf(“请输入数组中的元素数:\n”);
scanf(“%d”和“&n”);
内巴拉哈[n];
内坦帕拉亚[n];
对于(int i=0;i<(sizeof(baraja)/sizeof(baraja[0]);i++){
printf(“请输入数组的%d元素:\n”,i);
scanf(“%d”&baraja[i]);
}
printf(“非缓冲数组:\n”);
对于(i=0;i
您需要移动srand(时间(空))代码>在for
循环之外
如果您看到,rand()
是一个伪随机数生成器srand()
用于提供种子,rand()
将根据种子生成随机数
如果每次调用rand()
之前都使用相同的time(NULL)
种子,则rand()
的每个结果都将是相同的
为了获得所需的结果,您只需要使用srand()
对随机数生成器进行一次种子设定,之后每次调用rand()
,它都会给您随机数
注意:虽然这不是强制性的,但最好在main()
的末尾有一个显式的返回0
,您需要移动srand(时间(NULL))代码>在for
循环之外
如果您看到,rand()
是一个伪随机数生成器srand()
用于提供种子,rand()
将根据种子生成随机数
如果每次调用rand()
之前都使用相同的time(NULL)
种子,则rand()
的每个结果都将是相同的
为了获得所需的结果,您只需要使用srand()
对随机数生成器进行一次种子设定,之后每次调用rand()
,它都会给您随机数
注意:虽然这不是强制性的,但最好在main()
的末尾显式返回0,将srand(time(NULL))从循环中取出
发件人:
使用相同种子的两个不同初始化将生成
在对兰德公司的后续调用中也会出现相同的连续结果
因此,对于每次迭代,您都要初始化随机数生成器并获取第一项,这始终是相同的。从循环中获取srand(time(NULL))
发件人:
使用相同种子的两个不同初始化将生成
在对兰德公司的后续调用中也会出现相同的连续结果
因此,对于每次迭代,您都会初始化随机数生成器并获取第一项,这始终是相同的。如果您误用了srand
,则应在循环外只调用一次。这也是一种可能性,即srand
和rand
实现在您运行的平台上可能特别糟糕,如果程序快速重新执行,则会导致性能低下。如果您误用srand
,则只应在循环外调用一次。这也是一种可能性,即srand
和rand
实现在您运行的平台上可能特别糟糕,如果快速重新执行程序,则会导致性能低下。glibc srand()手册页,其中说明:“srand()函数将其参数设置为rand()返回的新伪随机整数序列的种子。通过使用相同的种子值调用srand(),这些序列是可重复的。“特别是,您的程序可能违反了以下子句:“…通过使用相同的种子值调用srand(),序列是可重复的。”因为它可以对rand进行种子设定()每秒超过一次--产生相同的伪随机数序列。glibc srand()手册页,其中说明:“srand()函数将其参数设置为rand()返回的新伪随机整数序列的种子。这些序列可通过调用srand()重复)具体来说,您的程序可能违反了以下子句:“…通过使用相同的种子值调用srand()序列是可重复的。”因为它可能会对rand()进行种子设定每秒超过一次——产生相同的伪随机数序列。好的,我来回答下面的问题。为什么srand()
在循环中是坏的
rand()
函数生成一个可接受的随机数序列,根本不需要srand()
。问题是它是一个固定序列,因此每次运行程序时,都会得到相同的“随机”数集
srand(time(NULL))
的目标是选择一个不同于以前任何起始值的起始值。time()
函数调用仅用于选择一个不同的起始点,其缺点是结果每秒仅更改一次。在同一秒内运行程序两次可能是一个问题
unsigned counter = time(NULL);
srand(counter++);