Rand()没有正确随机化

时间:2013-09-24 06:08:02

标签: c random

所以,我现在正在读一本关于C的书,在一个练习中,我应该做一个程序,可以从用户那里获得输入(1到12之间的数字)并且会“滚动”那个数量的骰子,并且然后显示结果。 问题是,当它随机化骰子数时,所有结果都完全相同。我确实使用“srand((unsigned)time(NULL))”来播种。什么可能出错?

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

int throw(void);

int main()
{
    int many,x,sum;
    sum = 0;

    puts("R O L L ' E M !");
    type:
    printf("How many dice would you like to roll (1 - 12)? ");
    scanf("%d",&many);
    if(many>12) {
        puts("You can roll up to 12 dice!");
        goto type;}
    if(many<1) {
        puts("You need to roll at least one die!");
        goto type;}

    int num[many];

    printf("\nRolling %d...\n",many);
    puts("Here they come!");

    printf(" ");        
    for(x=0;x<many;x++)     /* Shows which die it is */
    {
        if(x>=9)
            printf("%d  ",x+1);
        else
            printf(" %d  ",x+1);
    }
    putchar('\n');
    for(x=0;x<many;x++)     /* Thingy to illustrate the dice */
        printf("+---");
    puts("+");
    for(x=0;x<many;x++)     /* Shows dice results */
    {
        num[x] = throw();
        printf("| %d ",num[x]);
        sum = sum + num[x];
    }
    puts("|");
    for(x=0;x<many;x++)       /* Thingy to illustrate the dice */
        printf("+---");
    puts("+");

    printf("Total = %d",sum);    /* Shows total */
    return(0);
    }

int throw(void)  /* "Throws" the dice, by randomizing a number between 1 and 6 */
{
    int n;

    srand((unsigned)time(NULL));  /* seed */
    n = rand() % 6 + 1;           /* randomizes and limits from 1 to 6 */
    return(n);                      
}

2 个答案:

答案 0 :(得分:2)

每次拨打srand之前,您都在呼叫randsrand使用种子初始化算法。可能是因为调用之间的时间很短,时间戳是相同的,因此是种子。因此,您使用相同的值重新初始化算法,从而生成相同的数字序列。解决方案是每个线程只调用一次srand

答案 1 :(得分:1)

你必须在程序开头只使用一次srand(),否则rand()函数对所有调用使用相同的种子,因为srand在非常小的时间间隔内被调用多次,比a短第二,所有电话的种子保持不变..