如何避免在C中重复随机化的数字

时间:2014-11-02 16:53:44

标签: c random numbers repeat

int i,j,vec[15]={0};
srand (time(NULL));
 for (i=0;i<15;i++){
     vec[i]=rand() % 25+1;      
    for (j=0;j<15;j++){
        if (i!=j){
            while(vec[i]==vec[j]){
                vec[i]=rand() % 25+1;
                }
            }
        }
         printf("%d\n",vec[i]);
     }




return 0;
}

代码仍然给我重复的数字

示例: 24 3 7 20 18 10 12 17 9 7 4 25 13 15 21

我无法弄清楚该怎么做

5 个答案:

答案 0 :(得分:0)

重置j循环中的while

    for (j=0;j<i;j++){ //Use j<i 
        if (i!=j){
            while(vec[i]==vec[j]){
                vec[i]=rand() % 25+1;
                j=-1;//-1 because in the next iteration,j will start from 0
                }
            }
        }

答案 1 :(得分:0)

您可以使用数组

int randNumbers [25]; //从0到25开始填充它 将随机索引中的数字与数组中的最后一个数字交换后,将数字随机化,范围在0到25之间

随机0到23  等等....

int main(int argc, char **argv) {    
    static const int size = 25;
    int numbers[size];
    for( int i = 0; i < size; i++ ){
      numbers[i] = i;
    }

    srand (time(NULL));
    for( int i = 0; i < size; i++ ){
      int rIndex = rand()%(size - i);
      int rNum = numbers[rIndex];
      numbers[rIndex] = numbers[size-i];
      printf("%d ", rNum);
    }

    return 0;
}

O(n)复杂性......

答案 2 :(得分:0)

你的循环混乱了。逻辑是:生成一个随机数,直到找到一个不在列表中的随机数。

你这样做,你会在检查循环中生成一个新数字。但这并不奏效。假设您正在生成第4个数字并且发现它等于第三个数字。然后你生成一个新的,它可能等于你已经检查过的任何一个。

您还可以在j > i时检查未初始化的元素。你的内部循环最多只能运行i

所以:

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

int main()
{
    int vec[15] = { 0 };
    int i, j;

    srand(time(NULL));

    for (i = 0; i < 15; i++) {
        int okay = 0;

        while (!okay) {
            vec[i] = rand() % 25 + 1;
            okay = 1;

            for (j = 0; j < i; j++) {
                if (vec[i] == vec[j]) okay = 0;
            }
        }
        printf("%d\n", vec[i]);
    }

    return 0;
}

使用okay变量看起来仍然有些尴尬。在我看来,检查重复项应该是一个单独的功能:

int contains(int arr[], int n, int x)
{
    while (n--) {
        if (arr[n] == x) return 1;
    }

    return 0;
}

int main()
{
    // snip ...

    for (i = 0; i < 15; i++) {
        do {
            vec[i] = rand() % 25 + 1;
        } while (contains(vec, i, vec[i]));

        printf("%d\n", vec[i]);
    }

    // snip ...
}

在您的情况下,可能的数字范围并不比数组元素的数量大。您还可以创建有序数组{1, 2, 3, ..., 25},然后shuffle it并仅使用前15个元素。

答案 3 :(得分:0)

你是否真的试图改组数字,而不是用数据填充数组? (看起来你想要一个数字从1到25但是按随机顺序的数组。)rand()可以给你重复的数字(毕竟它们是 random !)

试试这个:

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

int
main( int argc, char **argv )
{
    int  i, vec[25];

    for (i = 0; i < 25; ++i) vec[i] = i + 1;

    /* Shuffle entries */
    srand( time( 0 ) );
    for (i = 0; i < 1000; ++i) {
        int a = rand( ) % 25;
        int b = rand( ) % 25;
        if (a != b) {
            int tmp = vec[a];
            vec[a] = vec[b];
            vec[b] = tmp;
        }
    }

    /* Print shuffled array */
    for (i = 0; i < 25; ++i) printf( "%d: %d\n", i, vec[i] );
    return 0;
}

答案 4 :(得分:0)

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

int inArray(int, int, int*);

int main()
{

    int i,j,vec[15]={0};
    int temp;
    srand (time(NULL));
    for (i=0;i<15;i++){
        temp =rand() % 25+1;      
        while(inArray(i+1,temp, vec) == 1){
            temp = rand() % 25+1;
        }
        vec[i] = temp;
        printf("VECT[%d]  \t=  %d\n",i,vec[i]);
    }
    return 0;
}

int inArray(int count, int input, int* array){
    int i = 0;
    for(i=0; i<count; i++){
        if(input == array[i]){
            return 1;
        }
    }
    return 0;
}

给出一个输出:

VECT[0]         =  24
VECT[1]         =  19
VECT[2]         =  1
VECT[3]         =  25
VECT[4]         =  22
VECT[5]         =  18
VECT[6]         =  7
VECT[7]         =  8
VECT[8]         =  12
VECT[9]         =  21
VECT[10]        =  11
VECT[11]        =  6
VECT[12]        =  23
VECT[13]        =  20
VECT[14]        =  15

检查已关闭,您将更改并且不会中断,允许将其更改为之前的值。