我的rand()函数不起作用

时间:2015-12-22 20:04:00

标签: c

这是我的功能:我需要随机获得的每个数字都是:一个大于50,一个是偶数,一个不是偶数。我只使用gcc和我使用c99。编译得很好,但是当它打印三个随机数时,它打印0,0和真正的随机数。我希望它能为我打印三个实数。感谢谁试图帮助!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define HIGH_NUMBER 100


int isValidNumbers(int num1,int num2, int num3);


int main(void)
{
    srand (time(NULL));
    int num1 = 0;
    int num2 = 0;
    int num3 = 0;
    num1,num2,num3 =isValidNumbers(num1,num2,num3);
    printf("%d %d %d\n",num1,num2,num3);    
    system("PAUSE");
    return 0;
}

int isValidNumbers(int num1,int num2, int num3)
{
    int i=1,ans = 0;
    do 
    {
        srand (time(NULL));
        num1 = rand()%HIGH_NUMBER;
        num2 = rand()%HIGH_NUMBER;
        num3 = rand()%HIGH_NUMBER;
        if ((num1%2==0||num2%2||num3%2==0)&&(num1%2==1||num2%2==1||num3%2==1)&&(num1>50||num2>50||num3>50))
        {
            return num1,num2,num3;
            i--;
            printf("%d %d %d",num1,num2,num3);
        }
    }
    while (i);

}

3 个答案:

答案 0 :(得分:2)

您的函数未按您的意愿设置调用变量。您不能返回多个函数值 - 并且您对main和函数中的变量赋予相同的名称没有区别 - 它们是不同的变量,当你写下它时,main只传递那些变量值的副本。

相反,我将指针传递给此示例中的那些变量。我还删除了函数的返回值,因为它现在总是返回有效值作为您的规范。

我删除了函数中的srand。它应该只被调用一次,特别是当我在这个例子中调用该函数3次以显示不同的结果时。如果留在函数中,则所有3个调用可能都会给出相同的结果(除非桥接了一秒计时器边界)。

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

#define HIGH_NUMBER 100

void ValidNumbers(int *num1, int *num2, int *num3);     // pointer arguments

int main(void)
{
    int num1 = 0;
    int num2 = 0;
    int num3 = 0;
    int tries;
    srand ((unsigned)time(NULL));           // call once
    for(tries=0; tries<3; tries++) {
        ValidNumbers(&num1, &num2, &num3);
        printf("%-2d %-2d %-2d\n", num1, num2, num3);    
    }
    return 0;
}

void ValidNumbers(int *num1, int *num2, int *num3)
{
    do {
        *num1 = rand() % HIGH_NUMBER;       // write through pointer of passed var
    } while (*num1 <= 50);                  // number > 50

    do {
        *num2 = rand() % HIGH_NUMBER;
    } while (*num2 % 2 != 0);               // even number

    do {
        *num3 = rand() % HIGH_NUMBER;
    } while (*num3 % 2 == 0);               // odd number
}

节目输出:

79 16 79
95 2  37
73 28 93

答案 1 :(得分:1)

C中不允许返回多个值。所以

return num1,num2,num3;

这不起作用。

您可以使用带有struct号码的3并将其返回。您可以通过this获取有关如何进行操作的示例。

另请注意if语句后面return内的语句永远不会执行,因此无用..

return num1,num2,num3;
i--;                                // <-- this will never get executed
printf("%d %d %d",num1,num2,num3);  // <-- this will never get executed

答案 2 :(得分:0)

C中有两种方法可以返回多个参数 上面提到的一个使用1 struct来保存struct中的所有返回值。

另一个是使用指针/地址来保存值。

我修改了脚本以显示两种方式。我将为HelloWorld添加一个积极的评论,你们太苛刻了,这是c中的一个重要概念:

#include <stdlib.h>
#include <stdio.h>
#define HIGH_NUMBER 100
typedef struct Random Random;
Random *isValidNumbers(int *num1,int *num2, int *num3);
struct Random{
    int a;
    int b;
    int c;
};

int main(void)
{
    int num1 = 0;
    int num2 = 0;
    int num3 = 0;
    /* pr to use as parameter, rr used as a return struct , just for demoo purpuse*/
    Random *p;
    p = isValidNumbers(&num1,&num2,&num3);
    printf("%d %d %d main return random numbers\n",num1,num2,num3);
    printf("%d %d %d main return from struct   \n",p->a,p->b,p->c);
    return 0;
}

Random *isValidNumbers(int *num1,int *num2, int *num3)
{
    struct Random *r = malloc(sizeof(Random));
    int i=1,ans = 0;
    do
    {
        srand (time(NULL));
        *num1 = rand()%HIGH_NUMBER;
        *num2 = rand()%HIGH_NUMBER;
        *num3 = rand()%HIGH_NUMBER;
        r->a = *num1;
        r->b = *num2;
        r->c = *num3;

        if ((*num1%2==0||*num2%2||*num3%2==0)&&(*num1%2==1||*num2%2==1||*num3%2==1)&&(*num1>50||*num2>50||*num3>50))
        {
            i--;
            printf("%d %d %d inside isValidNumber\n",*num1,*num2,*num3);
            break;
        }
    }
    while (i);
    return r;
}

结果:

cmake28 ..
make
[gliang@www build]$ ./src/random
99 99 44 inside isValidNumber
99 99 44 main return random numbers
99 99 44 main return from struct