随机数组没有重复的数字

时间:2015-10-22 15:20:29

标签: c arrays random

所以我要做的是创建一个包含5个元素的随机数组,这些元素应该填充1到6的数字,它们不会重复,我不知道我的逻辑错在哪里。

void genNumber(int vet[]){
   int max, i, j, atual;
   srand(time(NULL));

   max = 7;
   for (i=0;i<5;i++){
      vet[i] = rand() % max;
      while(vet[i] == 0){
         vet[i] = rand() % max;
      }

      for(j=0;j<i;j++){
         atual = vet[j];
         while((vet[i] == atual)||(vet[i] == 0)){
            vet[i] = rand() % max;
            atual = vet[j];
         }
      }
   }
}

更新:已修复

void genNumber(int vet[]){
int max, i, j;
srand(time(NULL));

max = 7;
for (i=0;i<5;i++){
    vet[i] = rand() % (max-1) + 1;

    for(j=0;j<i;j++){
        while(vet[j] == vet[i]){
            vet[i] = rand() % (max-1) + 1;
            j = 0;
        }
    }
}
}

3 个答案:

答案 0 :(得分:1)

逻辑缺陷是在找到重复时产生新随机数的方式。

想象一下,您已经拥有vel = {1,2,0,0,0,...},并且正在尝试为vel[2]找到一个号码。如果您随机抽取2,您就会发现它已经存在并再次绘制。但是如果你这次画了1,你就不会注意到,因为你只是比较了看到的最后一个值,2。所以你得到vel = {1,2,1,...}

&#34;解决方案&#34;:每次时间绘制一个新的随机数,您必须将其与列表中已有的所有数字进行比较。

解决这个问题的另一种方法是我试着在评论中概述的方法:你必须保留哪些数字对某个地方的抽奖仍然有效的信息。您可以使用&#34;输出&#34;你现在正在做的那个数组,或者你可以使用另一个商店,你可以从中删除&#34;一旦它被绘制的条目。

答案 1 :(得分:0)

生成随机数时,你必须检查它是否在数组中找到,所以迭代数组并检查。如果找到数字,生成另一个随机数并检查,直到找不到新的数字。分配它的数组。然后重复。

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

int check(int vet[],size_t size,int val);

void genNumber(int vet[],size_t size);

int main(void)
{
    srand(time(NULL));

    int vet[5];

    size_t size = 5;

    genNumber(vet,size);

    for( size_t n = 0 ; n < size ; n++ )
    {
        printf("%d ",vet[n]);
    }
}

void genNumber(int vet[],size_t size)
{
    int num = rand() % 6 + 1;

    vet[0] = num;

    for( size_t n = 1 ; n < size ; n++ )
    {
        num = rand() % 6 + 1;
        while( 1 )
        {
            if( check(vet,n,num) )
            {
                num = rand() % 6 + 1;
            }
            else
            {
                vet[n] = num;
                break;
            }
        }
    }
}

int check(int vet[],size_t size,int val)
{
    for( size_t n = 0 ; n < size ; n++ )
    {
        if( vet[n] == val )
        {
            return 1;//FOUND
        }
    }
    return 0;//NOT FOUND
}

答案 2 :(得分:0)

作为替代方案,您可以使用1到6的值填充数组。然后,您可以随机指示对数组进行随机播放。

#define MAX 6

void swap (int *a, int *b) {
  int temp = *a;
  *a = *b;
  *b = temp;
}

void genNumber(int *vet) {
  int i;

  for(i=0;i<MAX;i++) {
    vet[i] = i+1;
  }

  for(i = MAX-1;i > 0;i--) {
    // Pick a random index from 0 to i
    int j = rand() % (i+1);
    // Swap vet[i] with the element at random index
    swap(&vet[i], &vet[j]);
  }
}

如果您打算多次拨打srand(time(NULL));功能,也不应该在genNumber内部呼叫int vet[MAX] = {0}; srand(time(NULL)); genNumber(vet); for(i=0;i<5;i++) { printf("after num %d\n", vet[i]); } ,因为如果您拨打的话,它会给您相同的号码一秒一次。

然后只使用数组中的前五个元素。所以你可以从主

这样称呼它
vimgrep