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

ryoqjall  于 2023-02-03  发布在  其他
关注(0)|答案(4)|浏览(349)

我试着用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);
}
blmhpbnm

blmhpbnm1#

rand()返回范围为[0...RAND_MAX]int
基于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--不是很随机。

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

nfs0ujit2#

rand is int的结果,这意味着您不能直接从中获得12位数。
如果您需要的值总是12位数,您需要确保值适合特定的范围。
下面的示例假设您只需要一些数字为12位-您只需要8个额外的位-因此移位和OR'ing结果将产生0x 7 fffffffff-0范围内的数字,当打印为十进制时,通常会产生最多12位的输出:

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

PS:确保将存储结果的变量足够大,可以存储12位数字。

lbsnaicq

lbsnaicq3#

生成随机字符串或数字的简单方法是:

static char *ws_generate_token(size_t length) {

    static char charset[] = "abcdefghijklmnopqrstuvwxyz1234567890";
    char *randomString = NULL;

    if (length) {
        randomString = malloc(sizeof(char) * (length + 1));

        if (randomString) {
            for (int n = 0; n < length; n++) {
                int key = rand() % (int)(sizeof(charset) -1);
                randomString[n] = charset[key];
            }

            randomString[length] = '\0';
        }
    }

    return randomString;
}

解释代码

1.创建一个字符数组,其中包含(数字、字母等)
1.生成一个[0,数组长度]之间的随机数,我们将其命名为X。
1.获取字符数组中随机X位置的字符。
1.最后,将这个字符添加到您希望返回的字符串(或数字)序列中。

  • 如何使用 *
#define TOKEN_LENGTH      12
char *token;

token = ws_generate_token(TOKEN_LENGTH);
  • 从字符串到整型的转换 *
int token_int = atol(token);
  • 不要忘记 *
free(token); // free the memory when you finish
vc9ivgsu

vc9ivgsu4#

#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);
}

相关问题