生成C中范围内的随机整数值

时间:2013-04-12 02:28:28

标签: c random numbers integer generator

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

2 个答案:

答案 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处工作。