如何在C语言中生成范围(在本例中为1-12,包括1和12)之间的随机整数值?
我已经阅读了有关播种(srand())和在一个范围内使用rand()但我不确定如何去做。
编辑:这是我到目前为止所拥有的
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
// Craps Program
// Written by Kane Charles
// Lab 2 - Task 2
// 7 or 11 indicates instant win
// 2, 3 or 12 indicates instant los
// 4, 5, 6, 8, 9, 10 on first roll becomes "the point"
// keep rolling dice until either 7 or "the point is rolled"
// if "the point" is rolled the player wins
// if 7 is rolled then the player loses
int wins = 0, losses = 0;
int r, i;
int N = 1, M = 12;
int randomgenerator();
main(void){
/* initialize random seed: */
srand (time(NULL));
/* generate random number 10,000 times: */
for(i=0; i < 10000 ; i++){
int r = randomgenerator();
if (r = 7 || 11) {
wins++;
}
else if (r = 2 || 3 || 12) {
losses++;
}
else if (r = 4 || 5 || 6 || 8 || 9 || 10) {
int point = r;
int temproll;
do
{
int temproll = randomgenerator();
}while (temproll != 7 || point);
if (temproll = 7) {
losses++;
}
else if (temproll = point) {
wins++;
}
}
}
printf("Wins\n");
printf("%lf",&wins);
printf("\nLosses\n");
printf("%lf",&losses);
}
int randomgenerator(){
r = M + rand() / (RAND_MAX / (N - M + 1) + 1);
return r;
}
答案 0 :(得分:0)
简单的方法是
#include <stdlib.h>
#include <sys/time.h>
int main(void)
{
struct timeval t1;
gettimeofday(&t1, NULL);
srand(t1.tv_usec * t1.tv_sec);
int a = 1, b = 12;
int val = a + (b-a) * (double)rand() / (double)RAND_MAX + 0.5;
return 0;
}
编辑,因为有人问:你真的必须使用浮点运算才能使它正确出现(或者正确,因为它可以给出rand()
的限制,例如它们。任何纯粹依赖于整数运算和rand()
的解决方案都必须使用\
或%
,当发生这种情况时,你会得到舍入错误 - 其中c和d被声明为{{1例如,c / d == 2和d / c == 0.当从一个范围进行采样时,会发生的情况是将范围int
压缩到[0, RAND_MAX]
,你必须做某种分裂操作,因为前者比后者大得多。然后舍入产生偏见(除非你真的很幸运,事情均匀分裂)。这不是一个真正彻底的解释,但我希望传达这个想法。
答案 1 :(得分:-1)
您应该使用:M + rand() / (RAND_MAX / (N - M + 1) + 1)
请勿使用rand() % N
(尝试将数字从0返回到N-1)。它很差,因为许多随机数发生器的低阶位是令人沮丧的非随机的。 (See question 13.18.)
示例代码:
#include <stdio.h> /* printf, scanf, puts, NULL */
#include <stdlib.h> /* srand, rand */
#include <time.h> /* time */
int main ()
{
int r, i;
int M = 1,
N = 12;
/* initialize random seed: */
srand (time(NULL));
/* generate number between 1 and 12: */
for(i=0; i < 10 ; i++){
r = M + rand() / (RAND_MAX / (N - M + 1) + 1);
printf("\n%d", r);
}
printf("\n") ;
return EXIT_SUCCESS;
}
它在codepad处工作。