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

如何在C语言中生成12位随机数?,c,random,C,Random,我试图用C语言生成12位随机数,但它总是生成10位数字 #include <stdio.h> #include <time.h> #include <stdlib.h> void main() { srand(time(NULL)); long r = rand(); r = r*100; printf("%ld",r); } #包括 #包括 #包括 void main() { srand(时间(空)); 长r=rand(); r=

我试图用C语言生成12位随机数,但它总是生成10位数字

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

void main()
{
   srand(time(NULL));
   long r = rand();
   r = r*100;
   printf("%ld",r);
}
#包括
#包括
#包括
void main()
{
srand(时间(空));
长r=rand();
r=r*100;
printf(“%ld”,r);
}
的结果,这意味着您无法直接从中获取12位数字

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

下面的示例假设您只需要将其中一些数字设置为12位—您只需要8个额外的位—因此,移位和或运算结果将生成0x7FFFFFFFFFFF-0范围内的数字,当打印为十进制时,该数字通常最多输出12位:

r = rand();
r = (r << 8) | rand();
r=rand();
r=(r
rand()
返回
int
值,范围为
[0…rand\u MAX]

根据C规范,
RAND_MAX>=32767
RAND_MAX
包括
#包括
int main()
{
inti,n;
时间;
n=5;
/*初始化随机数生成器整数范围*/
srand((未签名)时间(&t));
/*从50到背面打印5个随机数
对于(i=0;i
请缩进您的代码。您知道12位数字不适合32位,因此请开始在您的平台上检查
long
类型的长度。叹气……如果
long
类型为32位(在许多平台上都是如此),则无法将12位数字放入
长的
。您在哪个平台上,使用哪个编译器?非常奇怪的是,显示的代码“总是生成10位数字”…我希望值字符串为100以上(3-12位),总是以00结尾(这不是很随机)Windows上的@kulst gcc也遵循Windows惯例,使用32位
long
。在32位Linux上
long
也是32位类型。请说明您所在的平台。未签名的long可以达到4294967295。long可以达到2147483647,这是10位数字。您需要“构造”您自己输入一个12位数字,因为您的最大结果最多只能达到10位(受rand函数的返回类型限制)。
(r我的重点是问题的原因和解决方法。谢谢你的建议,我会记住它。@Gnqz
无符号长可以达到4294967295。长可以达到2147483647
不正确的.C标准。这取决于编译器的实现。而且
int
可以有超过32位,所以绝对可以存储一个12位数字。这也取决于编译器的实现,但r=rand();r=(r你在做什么?打印一个0到32767之间的数字怎么样?
rand()%50
rand将打印一个5位数的数字,与你希望它返回或向前的位置不同,如上所述(50,45,40,35…)它与OP的问题有什么关系?您的程序甚至不会生成大于等于50的数字
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;
}
#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;
}
long r = rand();
r = r*100;
    #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);
}