-1

如何在 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;
}
4

2 回答 2

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()必须使用\or的解决方案%,当这种情况发生时,您将得到舍入错误——其中 c 和 d 被声明int并且 c = 5 和 d = 2,例如 c/d == 2和 d/c == 0。当从一个范围进行采样时,发生的情况是在将范围压缩[0, RAND_MAX]到 时[a, b],您必须进行某种除法运算,因为前者比后者大得多。然后舍入会产生偏差(除非你真的很幸运并且事情平分秋色)。不是一个真正彻底的解释,但我希望能传达这个想法。

于 2013-04-12T02:30:22.323 回答
-1

你应该使用:M + rand() / (RAND_MAX / (N - M + 1) + 1)

不要使用rand() % N(它试图返回从 0 到 N-1 的数字)。它很差,因为许多随机数生成器的低位是非随机的。(见问题 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工作。

于 2013-04-12T02:33:27.630 回答