3

我想得到 1 到 10 之间的随机数。它确实有效,但是当它处于循环中时,我并没有真正得到随机数。

int randomNum;
srand ( (unsigned int)time(NULL) );
randomNum = rand() % 10;

我在这里和谷歌花了几个小时寻找解决方案,但看起来没有人真正解决它(或者我搜索得不够好)。我们从随机化器获得的值取决于秒(不是毫秒或其他东西,就像在其他编程语言中一样),这就是数字不是随机的原因。

此外,我不想下载 C 包,因为我在大学实验室运行我的代码,他们不允许这样做。

有没有人对这个问题有创造性的解决方案?也许一些数学函数?

4

3 回答 3

5

为了说明西多的答案。

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

int main(int argc, char** argv)
{
    int i;

    srand ( (unsigned int)time(NULL) );

    for (i = 0; i < 100; i++)
    {
        printf("%d ", 1 + (rand() % 10));
    }
    putchar('\n');
    return 0;
}

这为我使用 time() 的一次性种子产生了以下结果。

7 10 2 4 4 4 2 1 7 7 10 4 3 10 2 9 6 9 2 9 7 10 4 1 1 8 2 4 8 1 2
4 2 3 9 5 8 1 7 4 9 8 10 1 8 1 1 5 1 4 5 7 3 9 10 3 6 1 9 3 4 10
8 5 2 7 2 2 9 10 5 9 8 4 1 7 7 2 3 7 5 8 6 10 8 5 4 3 7 2 8 2 1 7
7 5 5 10 6 5 
于 2013-04-05T02:45:09.840 回答
2

不要多次播种随机数生成器。由于您的代码可能在同一秒内全部运行,因此每个查询都rand使用相同的种子,因此您每次都会得到相同的数字。

于 2013-04-05T02:33:10.363 回答
1

戴夫纽曼提供了一个很好的答案。或者,您也可以尝试使用伪随机生成器,例如

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

int main()
{
    int a0; // this value will be our requirement
    int mod = 11; //this is the limit (0 - mod-1), here 10
    int a; // this stores the previous value of a0;
    int i; // loop variable
    int mul=25; //multiplicative factor
    int add=3; // additive factor
    int limit=100; // our limit
    srand ( (unsigned int)time(NULL) ); // initialize the seed
    a0 = rand() % mod;
    for(i=0;i<limit;i++)
    {
        printf("%d\t",a0);
        a = a0;
        a0 = (a * mul + add) % mod;
    }
    putchar('\n');
    return 0;
}

输出::


第一次运行::

2       10      4       3       1       8       0       6       7       9       2       10      4       3       1       8       0       6
7       9       2       10      4       3       1       8       0       6       7       9       2       10      4       3       1       8
0       6       7       9       2       10      4       3       1       8       0       6       7       9       2       10      4       3
1       8       0       6       7       9       2       10      4       3       1       8       0       6       7       9       2       10
4       3       1       8       0       6       7       9       2       10      4       3       1       8       0       6       7       9
2       10      4       3       1       8       0       6       7       9

第二个输出::

9       2       10      4       3       1       8       0       6       7       9       2       10      4       3       1       8       0
6       7       9       2       10      4       3       1       8       0       6       7       9       2       10      4       3       1
8       0       6       7       9       2       10      4       3       1       8       0       6       7       9       2       10      4
3       1       8       0       6       7       9       2       10      4       3       1       8       0       6       7       9       2
10      4       3       1       8       0       6       7       9       2       10      4       3       1       8       0       6       7
9       2       10      4       3       1       8       0       6       7

于 2013-04-05T17:23:16.370 回答