所以,我现在正在读一本关于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);
}
答案 0 :(得分:2)
每次拨打srand
之前,您都在呼叫rand
。 srand
使用种子初始化算法。可能是因为调用之间的时间很短,时间戳是相同的,因此是种子。因此,您使用相同的值重新初始化算法,从而生成相同的数字序列。解决方案是每个线程只调用一次srand
。
答案 1 :(得分:1)
你必须在程序开头只使用一次srand(),否则rand()函数对所有调用使用相同的种子,因为srand在非常小的时间间隔内被调用多次,比a短第二,所有电话的种子保持不变..