我试图在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];
}
答案 0 :(得分:2)
rand()
返回int
[0...RAND_MAX]
值
基于C规范,RAND_MAX >= 32767
和RAND_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);
}