Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 随机化4个不同的数字_C - Fatal编程技术网

C 随机化4个不同的数字

C 随机化4个不同的数字,c,C,我尝试用C将4个不同的数字随机化,并尝试下一个代码: { int num1 = 0, num2 = 0, num3 = 0, num4 = 0; int i = 0; while (num1 == num2 && num1 == num3 && num1 == num4 && num2 == num3 && num2 == num4 && num3 == num4 && num

我尝试用C将4个不同的数字随机化,并尝试下一个代码:

{
    int num1 = 0, num2 = 0, num3 = 0, num4 = 0;
    int i = 0;
    while (num1 == num2 && num1 == num3 && num1 == num4 && num2 == num3 && num2 == num4 && num3 == num4 && num3 == num2)
    {
        num1 = rand() % 7;
        num2 = rand() % 7;
        num3 = rand() % 7;
        num4 = rand() % 7;
    }
    printf("%d %d %d %d\n", num1, num2, num3, num4);
}
代码假设检查这些数字是否相等,如果它们相等,则需要生成新的数字,直到它们完全不同。 但由于某些原因,它不能很好地工作,即使是正确的数字,它也会把它们当作错误的数字,变成一个无休止的循环

我错过了什么?

试着这样做

void
get_random_values(int *values)
{
    int source[] = {0, 1, 2, 3, 4, 5, 6};
    for (int i = 0 ; i < 7 ; ++i)
    {
        int saved;
        int j = rand() % 7;
        int k = rand() % 7;
        saved = source[j];
        source[j] = source[k];
        source[k] = saved;        
    }
    values[0] = source[0];
    values[1] = source[1];
    values[2] = source[2];
    values[3] = source[3];
}

int
main(void)
{
    int values[4];
    srand(time(NULL));
    get_random_values(values);
    for (int i = 0 ; i < 4 ; ++i)
        fprintf(stderr, "%d ", values[i]);
    fprintf(stderr, "\n");

    return 0;
}
void
获取随机值(int*值)
{
int source[]={0,1,2,3,4,5,6};
对于(int i=0;i<7;++i)
{
保存整数;
int j=rand()%7;
int k=rand()%7;
保存=源[j];
源[j]=源[k];
源[k]=已保存;
}
值[0]=源[0];
值[1]=源[1];
值[2]=源[2];
值[3]=源[3];
}
int
主(空)
{
int值[4];
srand(时间(空));
获取随机值(值);
对于(int i=0;i<4;++i)
fprintf(标准,“%d”,值[i]);
fprintf(标准格式,“\n”);
返回0;
}
不要忘了在程序启动时设置随机种子
srand()
,否则您将始终获得相同的序列。

像这样尝试

void
get_random_values(int *values)
{
    int source[] = {0, 1, 2, 3, 4, 5, 6};
    for (int i = 0 ; i < 7 ; ++i)
    {
        int saved;
        int j = rand() % 7;
        int k = rand() % 7;
        saved = source[j];
        source[j] = source[k];
        source[k] = saved;        
    }
    values[0] = source[0];
    values[1] = source[1];
    values[2] = source[2];
    values[3] = source[3];
}

int
main(void)
{
    int values[4];
    srand(time(NULL));
    get_random_values(values);
    for (int i = 0 ; i < 4 ; ++i)
        fprintf(stderr, "%d ", values[i]);
    fprintf(stderr, "\n");

    return 0;
}
void
获取随机值(int*值)
{
int source[]={0,1,2,3,4,5,6};
对于(int i=0;i<7;++i)
{
保存整数;
int j=rand()%7;
int k=rand()%7;
保存=源[j];
源[j]=源[k];
源[k]=已保存;
}
值[0]=源[0];
值[1]=源[1];
值[2]=源[2];
值[3]=源[3];
}
int
主(空)
{
int值[4];
srand(时间(空));
获取随机值(值);
对于(int i=0;i<4;++i)
fprintf(标准,“%d”,值[i]);
fprintf(标准格式,“\n”);
返回0;
}

不要忘记在程序启动时设置随机种子
srand()
,否则您将始终获得相同的序列。

此代码将在0范围内选择4个不同的数字。。它的工作原理是创建一个可用数字数组,当每个数字都被选中时,它就会从列表中删除

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

#define RANGE   7                   // how many different numbers
#define PICK    4                   // how many to pick

int main(void) {
    int pool[RANGE];
    int size, n, i;
    for (size=0; size<RANGE; size++) {
        pool[size] = size;          // create number pool 0..6
    }
    srand((unsigned)time(NULL));

    // pick different numbers
    for(i=0; i<PICK; i++) {
        n = rand() % size;          // random array index
        printf("%d ", pool[n]);     // select number from pool
        pool[n] = pool[--size];     // remove from pool
    }
    printf("\n");
    return 0;
}
#包括
#包括
#包括
#定义范围7//有多少不同的数字
#定义拾取4//要拾取的数量
内部主(空){
int池[范围];
int大小,n,i;

对于(size=0;size此代码将在0..6范围内选取4个不同的数字,其工作方式是创建一个可用数字的数组,当选取每个数字时,它将从列表中删除

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

#define RANGE   7                   // how many different numbers
#define PICK    4                   // how many to pick

int main(void) {
    int pool[RANGE];
    int size, n, i;
    for (size=0; size<RANGE; size++) {
        pool[size] = size;          // create number pool 0..6
    }
    srand((unsigned)time(NULL));

    // pick different numbers
    for(i=0; i<PICK; i++) {
        n = rand() % size;          // random array index
        printf("%d ", pool[n]);     // select number from pool
        pool[n] = pool[--size];     // remove from pool
    }
    printf("\n");
    return 0;
}
#包括
#包括
#包括
#定义范围7//有多少不同的数字
#定义拾取4//要拾取的数量
内部主(空){
int池[范围];
int大小,n,i;
对于(size=0;size获得随机序列:

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

#define N 7

int main(int argc, char **argv)
{
    // seed random number generator with first argument for easier testing 
    if (argc > 1) {
        srand(atoi(argv[1]));
    }

    int array[N] = {0,1,2,3,4,5,6};

    // Fisher–Yates shuffle:
    // https://en.wikipedia.org/w/index.php?oldid=697311634#The_modern_algorithm
    for (unsigned i = 0; i < N - 1; ++i) {
        unsigned modulo = N - i;

        // unbiased rand() % modulo:
        // https://stackoverflow.com/a/10989061/416224
        unsigned j;
        do {
            j = rand();
        } while (j >= RAND_MAX - (RAND_MAX % modulo));
        j %= modulo;

        if (j > 0) {
            int tmp = array[i];
            array[i] = array[i + j];
            array[i + j] = tmp;
        }
    }

    for (unsigned i = 0; i < N; ++i) {
        printf("%u. %d\n", i + 1, array[i]);
    }

    return 0;
}
#包括
#包括
#定义n7
int main(int argc,字符**argv)
{
//带有第一个参数的种子随机数生成器,便于测试
如果(argc>1){
srand(atoi(argv[1]);
}
int数组[N]={0,1,2,3,4,5,6};
//费舍尔-耶茨洗牌:
// https://en.wikipedia.org/w/index.php?oldid=697311634#The_modern_algorithm
for(无符号i=0;i=RAND_MAX-(RAND_MAX%模));
j%=模;
如果(j>0){
int tmp=数组[i];
数组[i]=数组[i+j];
阵列[i+j]=tmp;
}
}
for(无符号i=0;i
请按照代码中的参考链接进行操作。

获取随机序列:

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

#define N 7

int main(int argc, char **argv)
{
    // seed random number generator with first argument for easier testing 
    if (argc > 1) {
        srand(atoi(argv[1]));
    }

    int array[N] = {0,1,2,3,4,5,6};

    // Fisher–Yates shuffle:
    // https://en.wikipedia.org/w/index.php?oldid=697311634#The_modern_algorithm
    for (unsigned i = 0; i < N - 1; ++i) {
        unsigned modulo = N - i;

        // unbiased rand() % modulo:
        // https://stackoverflow.com/a/10989061/416224
        unsigned j;
        do {
            j = rand();
        } while (j >= RAND_MAX - (RAND_MAX % modulo));
        j %= modulo;

        if (j > 0) {
            int tmp = array[i];
            array[i] = array[i + j];
            array[i + j] = tmp;
        }
    }

    for (unsigned i = 0; i < N; ++i) {
        printf("%u. %d\n", i + 1, array[i]);
    }

    return 0;
}
#包括
#包括
#定义n7
int main(int argc,字符**argv)
{
//带有第一个参数的种子随机数生成器,便于测试
如果(argc>1){
srand(atoi(argv[1]);
}
int数组[N]={0,1,2,3,4,5,6};
//费舍尔-耶茨洗牌:
// https://en.wikipedia.org/w/index.php?oldid=697311634#The_modern_algorithm
for(无符号i=0;i=RAND_MAX-(RAND_MAX%模));
j%=模;
如果(j>0){
int tmp=数组[i];
数组[i]=数组[i+j];
阵列[i+j]=tmp;
}
}
for(无符号i=0;i

请按照代码中的参考链接操作。

我建议通用解决方案:

  • 任意大小的数组

  • 下限和上限作为参数发送

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    void random(int* values, int amount, int lower_bound, int upper_bound)
    {
        int i=0, j=0, temp;
        if(amount > upper_bound - lower_bound + 1)
            return; // if there are more numbers than given bound
    
        for(i=0; i<amount; )
        {
            temp = rand() % ( upper_bound - lower_bound + 1 ) + lower_bound;
            for(j=i-1; j>=0; --j)
                if(temp==values[j])
                    break;
    
            if(temp==values[j])
                continue;
    
            values[i]=temp;
            ++i;
        }
    }
    
    int main()
    {
        srand(time(NULL));
        int arr[4]={0,0,0,0};
        random(arr, 4, 5, 10);
        for(int i=0; i<4; ++i)
            printf("%d\n", arr[i]);
    }
    
    #包括
    #包括
    #包括
    void random(int*值、int金额、int下限、int上限)
    {
    int i=0,j=0,温度;
    如果(金额>上限-下限+1)
    return;//如果有超过给定范围的数字
    对于(i=0;i=0;--j)
    如果(温度==值[j])
    打破
    如果(温度==值[j])
    继续;
    数值[i]=温度;
    ++一,;
    }
    }
    int main()
    {
    srand(时间(空));
    int arr[4]={0,0,0,0};
    随机(arr,4,5,10);
    
    对于(int i=0;i我建议通用解决方案:

    • 任意大小的数组

    • 下限和上限作为参数发送

      #include <stdio.h>
      #include <stdlib.h>
      #include <time.h>
      
      void random(int* values, int amount, int lower_bound, int upper_bound)
      {
          int i=0, j=0, temp;
          if(amount > upper_bound - lower_bound + 1)
              return; // if there are more numbers than given bound
      
          for(i=0; i<amount; )
          {
              temp = rand() % ( upper_bound - lower_bound + 1 ) + lower_bound;
              for(j=i-1; j>=0; --j)
                  if(temp==values[j])
                      break;
      
              if(temp==values[j])
                  continue;
      
              values[i]=temp;
              ++i;
          }
      }
      
      int main()
      {
          srand(time(NULL));
          int arr[4]={0,0,0,0};
          random(arr, 4, 5, 10);
          for(int i=0; i<4; ++i)
              printf("%d\n", arr[i]);
      }
      
      #包括
      #包括
      #包括
      void random(int*值、int金额、int下限、int上限)
      {
      int i=0,j=0,温度;
      如果(金额>上限-下限+1)
      return;//如果有超过给定范围的数字
      对于(i=0;i=0;--j)
      如果(温度==值[j])
      打破
      如果(温度==值[j])
      继续;
      数值[i]=温度;
      ++一,;
      }
      }
      int main()
      {
      srand(时间(空));