Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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_Variables_Random - Fatal编程技术网

C 如何防止随机变量重复相同的数字

C 如何防止随机变量重复相同的数字,c,variables,random,C,Variables,Random,所以我只是在学习C,我想知道如何防止使用rand()函数随机化的变量重复相同的数字。我有一个脚本,它简单地将一个变量随机化并在for循环中打印4次。如何使变量在每次使用rand()函数后都不会得到相同的数字 #include <stdio.h> #include <stdlib.h> int randomInt; int main() { srand(time(0)); for (int i = 0; i < 4; ++i) { ra

所以我只是在学习C,我想知道如何防止使用rand()函数随机化的变量重复相同的数字。我有一个脚本,它简单地将一个变量随机化并在for循环中打印4次。如何使变量在每次使用rand()函数后都不会得到相同的数字

#include <stdio.h>
#include <stdlib.h>
int randomInt;
int main()
{
    srand(time(0));
    for (int i = 0; i < 4; ++i) {
        randomInt = rand() % 4;
        printf("%d\n", randomInt);
    }
    return 0;
}
#包括
#包括
int-randomInt;
int main()
{
srand(时间(0));
对于(int i=0;i<4;++i){
randomInt=rand()%4;
printf(“%d\n”,randomInt);
}
返回0;
}

在大多数机器上,
int
是32位。因此,在232次迭代之后,您肯定会得到一些重复(而且可能会更早)

如果你限制自己的循环要少得多,考虑一下保持一个以前满足的随机数数组(或者一些哈希表,或者一些二进制树,或者其他容器)。 对于仅重复4次的循环,保留一个先前发出的数字数组(最多4-1个)非常简单,而且足够有效


另请阅读有关。

在大多数机器上,
int
为32位。因此,在232次迭代之后,您肯定会得到一些重复(而且可能会更早)

如果你限制自己的循环要少得多,考虑一下保持一个以前满足的随机数数组(或者一些哈希表,或者一些二进制树,或者其他容器)。 对于仅重复4次的循环,保留一个先前发出的数字数组(最多4-1个)非常简单,而且足够有效


另外,请阅读。

您可以做的是跟踪您已经生成的每个数字

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int hasMyNumberAlreadyBeenGenerated(int number, int generatedNumbers[], int size){

  for(int i = 0; i < size + 1; i++){
    //If you already generated the number, it should be present somewhere in your array
    if(generatedNumbers[i] == number) return 1;
    //If you did not, find the first available space in your array, and put the number you generated into that space
    if(generatedNumbers[i] == 0){
      generatedNumbers[i] = number;
      break; //No need to continue to check the array
    }
  }

  return 0;
}


int main()
{
  int randomInt;
  int generatedNumbers[4];
  //We set "0" in all the array, to be sure that the array doesn't contain unknown datas when we create it
  memset(generatedNumbers, 0x0, sizeof(generatedNumbers));

    srand(time(0));
    for (int i = 0; i < 4; ++i) {
        randomInt = rand() % 4 + 1;
        //As long as the number you generate has already been generated, generate a new one
        while(hasMyNumberAlreadyBeenGenerated(randomInt, generatedNumbers, i) == 1){
          randomInt = rand() % 4 + 1;
        }
        printf("generated : %d\n", randomInt);
    }
    return 0;
}
#包括
#包括
#包括
int HasMyNumberReadyBeenGenerated(int编号,int generatedNumbers[],int大小){
对于(int i=0;i
这个方法的问题是,你不能生成一个0,因为如果你这样做,你将无休止地循环。 可以使用malloc()函数使用动态数组绕过此问题。
如果你想写干净的代码,你应该定义你想用#define生成多少个数字。

你能做的就是跟踪你已经生成的每个数字

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int hasMyNumberAlreadyBeenGenerated(int number, int generatedNumbers[], int size){

  for(int i = 0; i < size + 1; i++){
    //If you already generated the number, it should be present somewhere in your array
    if(generatedNumbers[i] == number) return 1;
    //If you did not, find the first available space in your array, and put the number you generated into that space
    if(generatedNumbers[i] == 0){
      generatedNumbers[i] = number;
      break; //No need to continue to check the array
    }
  }

  return 0;
}


int main()
{
  int randomInt;
  int generatedNumbers[4];
  //We set "0" in all the array, to be sure that the array doesn't contain unknown datas when we create it
  memset(generatedNumbers, 0x0, sizeof(generatedNumbers));

    srand(time(0));
    for (int i = 0; i < 4; ++i) {
        randomInt = rand() % 4 + 1;
        //As long as the number you generate has already been generated, generate a new one
        while(hasMyNumberAlreadyBeenGenerated(randomInt, generatedNumbers, i) == 1){
          randomInt = rand() % 4 + 1;
        }
        printf("generated : %d\n", randomInt);
    }
    return 0;
}
#包括
#包括
#包括
int HasMyNumberReadyBeenGenerated(int编号,int generatedNumbers[],int大小){
对于(int i=0;i
这个方法的问题是,你不能生成一个0,因为如果你这样做,你将无休止地循环。 可以使用malloc()函数使用动态数组绕过此问题。
如果你想写干净的代码,你应该定义你想用一个#define生成多少个数字。

我猜你得到的数字是相同的,因为你在同一秒内多次运行你的程序。如果时间(0)未更改,则将生成相同的种子和相同的随机数。除非您的程序运行得非常快,否则我认为使用基于微秒而不是秒的种子将有效:

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/time.h>
    int randomInt;
    int main()
    {
        struct timeval my_microtimer;
        gettimeofday(&t1, NULL);
        srand(t1.tv_sec * my_microtimer.tv_usec);
        for (int i = 0; i < 4; ++i) {
            randomInt = rand() % 4;
            printf("%d\n", randomInt);
        }
        return 0;
    }
#包括
#包括
#包括
int-randomInt;
int main()
{
struct timeval my_microtimer;
gettimeofday(&t1,NULL);
srand(t1.tv_sec*my_microtimer.tv_usec);
对于(int i=0;i<4;++i){
randomInt=rand()%4;
printf(“%d\n”,randomInt);
}
返回0;
}

我猜您得到的数字是相同的,因为您的程序在同一秒内运行了多次。如果时间(0)未更改,则将生成相同的种子和相同的随机数。除非您的程序运行得非常快,否则我认为使用基于微秒而不是秒的种子将有效:

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/time.h>
    int randomInt;
    int main()
    {
        struct timeval my_microtimer;
        gettimeofday(&t1, NULL);
        srand(t1.tv_sec * my_microtimer.tv_usec);
        for (int i = 0; i < 4; ++i) {
            randomInt = rand() % 4;
            printf("%d\n", randomInt);
        }
        return 0;
    }
#包括
#包括
#包括
int-randomInt;
int main()
{
struct timeval my_microtimer;
gettimeofday(&t1,NULL);
srand(t1.tv_sec*my_microtimer.tv_usec);
对于(int i=0;i