如何在C中生成12位数的随机数?

时间:2016-11-01 13:03:27

标签: c random

我试图在C中生成12位数的随机数,但它总是产生10位数字。

UILabel *timerLabel; //label where time will be showed.
#define kTimerOff 0
#define kTimerOn 1

-(void)startTimer:(UILabel*)timerLabel
{
    if ( timerLabel.tag == kTimerOn )
        [self stopTimer:timerLabel];
    else
    {
        timerLabel.tag = kTimerOn;

        self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerTick:) userInfo:timerLabel repeats:YES];
        [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
    }
}

-(void)stopTimer:(UILabel*)timerLabel
{
    timerLabel.tag = kTimerOff;

    [self.timer invalidate];
}


-(void)timerTick:(NSTimer *)timer 
{
    UILabel *currentTimerLabel = timer.userInfo;
    NSString *currentTimerString = currentTimerLabel.text;
    int minutes = [[currentTimerString substringToIndex:2] intValue];
    int seconds = [[currentTimerString substringFromIndex:3] intValue];

    seconds++;
    if (seconds == 60)
    {
        seconds = 0;
        minutes++;
    }
    currentTimerLabel.text = [NSString stringWithFormat:@"%02d:%02d", minutes, seconds];
}

3 个答案:

答案 0 :(得分:2)

rand()返回int

范围内的[0...RAND_MAX]

基于C规范,RAND_MAX >= 32767RAND_MAX <= INT_MAX

多次调用rand()以创建宽值

unsigned long long rand_atleast12digit(void) {
  unsigned long long r = rand();
  #if RAND_MAX >= 999999999999
  #elif RAND_MAX >= 999999
    r *= RAND_MAX + 1ull;
    r += rand();
  #else
    r *= RAND_MAX + 1ull;
    r += rand();
    r *= RAND_MAX + 1ull;
    r += rand();
  #endif
  return r;
}

如果范围为0到至少 999,999,999,999,则上面返回一个数字。要将其减少到只有该范围,代码可以使用return r % 1000000000000;

使用%可能无法创建随机数的均衡分布。其他帖子详细说明了如何处理如this good one所示的内容,如下所示。

#if RAND_MAX >= 999999999999
  #define R12DIGIT_DIVISOR (RAND_MAX/1000000000000)
#elif RAND_MAX >= 999999
  #define RAND_MAX_P1  (RAND_MAX+1LLU)
  #define R12DIGIT_DIVISOR ((RAND_MAX_P1*RAND_MAX_P1-1)/1000000000000)
#else
  #define RAND_MAX_P1  (RAND_MAX+1LLU)
  #define R12DIGIT_DIVISOR  ((RAND_MAX_P1*RAND_MAX_P1*RAND_MAX_P1-1)/1000000000000)
#endif

unsigned long long rand_12digit(void) {
    unsigned long long retval;
    do { 
        retval = rand_atleast12digit() / R12DIGIT_DIVISOR;
    } while (retval == 1000000000000);
    return retval;
}

请注意,rand()的质量定义不明确,因此重复调用可能无法提供高质量结果。

如果long为32位,OP的代码将失败,因为它缺少12位十进制数值的范围。 @Michael Walz

如果long足够宽,*100将始终生成至少2位小数00 - 不是非常随机。 @Alexei Levenkov

long r = rand();
r = r*100;

答案 1 :(得分:1)

rand is int的结果,这意味着您无法直接从中获取12位数字。

如果您需要的值始终为12位数,则需要确保值适合特定范围。

下面的示例假设您只需要一些数字为12位数 - 您只需要8个额外位 - 因此移位和OR结果会产生0x7fffffffff-0范围内的数字,通常会导致12打印为十进制时的数字输出:

r = rand();
r = (r << 8) | rand();

PS:确保存储结果的变量足以存储12位数字。

答案 2 :(得分:-3)

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

int main()
{
   int i, n;
   time_t t;

   n = 5;

   /* Intializes random number generator int range */
   srand((unsigned) time(&t));

   /* Print 5 random numbers from 50 to back
   for( i = 0 ; i < n ; i++ ) 
   {
      printf("%d\n", rand() % 50);
   }

   return(0);
}