为什么不打印随机数?

时间:2018-03-11 08:14:29

标签: c

此代码有什么问题?

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

void createNumb(int RandomNumber) {

    srand(time(NULL));

    int a, b, c, d;

    a = rand() % 10 + 0;
    b = rand() % 10 + 0;
    c = rand() % 10 + 0;
    d = rand() % 10 + 0;

    while (b == a) {
        b = rand() % 10 + 0;        
    }

    while (c == b || c == a) {
        c = rand() % 10 + 0;     
    }

    while (d == c || d == b || d == a) {
        d = rand() % 10 + 0;
    }

    RandomNumber = ("%d%d%d%d", a * 1000 + b * 100 + c * 10 + d * 1);   
}

int main() {   
    int x;
    createNumb(x);
    printf("%d", x);
}

当我运行此程序时,它总是给我结果0

我希望它能够打印一个随机的4位数字(每个数字必须是唯一的)。有什么问题?

2 个答案:

答案 0 :(得分:3)

  • 您的createNumb函数返回void而不是int
  • 您应该只使用srand(),因此最好将其移至main

您的createNumb函数应该返回一个随机整数,如下所示:

int createNumb(void) {
    /*
    ** Simplified for readability.
    ** Here you would use your function that generates 4 different digits
    */
    return rand();
}

int main(void) {
    srand(time(NULL))(
    int x = createNumb();
    printf("%d" , x);
}

或者,如果您希望createNumb 填充现有整数,请使用pointer

void createNumb(int *randomNumber) {
    /*
    ** Simplified for readability.
    ** Here you would use your function that generates 4 different digits
    */
    *randomNumber = rand();
}

int main(void) {
    int x;
    srand(time(NULL))
    createNumb(&x); // Passing a pointer to x
    printf("%d" , x);
}

答案 1 :(得分:2)

您的C代码存在一些问题,来自不同的语言:

  • 使用return从函数返回一个值,并在函数名称之前指定返回类型。
  • 我们尝试格式化数字不正确且不需要。顺便提一下,RandomNumber = ("%d%d%d%d", a * 1000 + b * 100 + c * 10 + d * 1);使用忽略其左操作数的运算符,并求值为右操作数,其值存储在具有自动存储持续时间的局部变量中,并在函数退出时丢失。只需使用return a * 1000 + b * 100 + c * 10 + d * 1;
  • 要计算4位伪随机值,您可以使用rand() % 10000,但可能需要更多数字或特殊约束(如唯一数字)等方法。
  • 为了让您的结果更随机,请为srand()使用更快的更改源,例如clock(),并在main()函数中初始化伪随机数生成器。
  • 如果结果小于1000,您可以使用printf格式"%04d"显示初始0

以下是修改后的版本:

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

int createNumb(void) {
    int a, b, c, d;

    a = rand() % 10;
    b = rand() % 10;
    c = rand() % 10;
    d = rand() % 10;

    while (b == a) {
        b = rand() % 10;        
    }

    while (c == b || c == a) {
        c = rand() % 10;     
    }

    while (d == c || d == b || d == a) {
        d = rand() % 10;
    }

    return a * 1000 + b * 100 + c * 10 + d;   
}

int main() {
    int x;
    srand(clock());
    x = createNumb();
    printf("%04d\n", x);
    return 0;
}

请注意,您可以避免creatNumb()中的循环。这是一个修改版本,它从命令行获取一个参数以产生多个结果。

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

int createNumb(void) {
    int a, b, c, d, bb, cc, dd;

    a = rand() % 10;
    b = rand() % 9;
    c = rand() % 8;
    d = rand() % 7;

    bb = (b >= a);
    cc = (c >= a) + (c >= b);
    cd = (d >= a) + (d >= b) + (d >= c);

    return a * 1000 + (b + bb) * 100 + (c + cc) * 10 + (d + dd);
}

int main(int argc, char *argv[]) {
    int x, n;
    srand(clock());
    n = (argc > 1) ? strtol(argv[1], NULL, 0) : 1;
    while (n-- > 0) {
        x = createNumb();
        printf("%04d\n", x);
    }
    return 0;
}

布尔运算符在为真时评估为1,否则为0bb = (b >= a);是一个简短的表示法:

bb = 0;
if (b >= a)
    bb = 1;

如果要计算具有给定约束的4个数字的数组,则应将指向目标数组的指针作为creatNumb()的参数传递。以下是使用此方法的修改版本:

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

void createNumb(int *dest) {
    int a, b, c, d, bb, cc, dd;

    a = rand() % 10;
    b = rand() % 9;
    c = rand() % 8;
    d = rand() % 7;

    bb = (b >= a);
    cc = (c >= a) + (c >= b);
    cd = (d >= a) + (d >= b) + (d >= c);

    dest[0] = a;
    dest[1] = b + bb;
    dest[2] = c + cc;
    dest[3] = d + dd;
}

int main(int argc, char *argv[]) {
    int array[4];
    srand(clock());
    createNumb(array);
    printf("%d%d%d%d\n", array[0], array[1], array[2], array[3]);
    return 0;
}

请注意,将数组作为参数传递给函数实际上会将指针传递给其第一个元素:createNumb(array);等同于createNumb(&array[0]);。这个过程被称为数组在大多数表达式上下文中衰减为指针,它对于初学者来说有点混乱但允许有效的参数传递。