Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 洗牌_C_Arrays_Random_Shuffle - Fatal编程技术网

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++);