[英]How to generate 12 digit random number in C?
我試圖在 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);
}
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;
。
使用%
可能不會創建隨機數的平衡分配。 其他帖子詳細介紹了如何應對這種情況 ,如下所示。
#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位十進制數字值的范圍。 @邁克爾·沃爾茲
如果long
足夠寬, *100
將始終使至少2個十進制數字00
不是很隨機。 @亞歷克謝·萊文科夫
long r = rand();
r = r*100;
我生成隨機字符串或數字的簡單方法是:
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;
}
解釋代碼
如何使用它?
#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
#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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.