簡體   English   中英

C中如何生成12位隨機數?

[英]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 >= 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;


使用%可能不會創建隨機數的平衡分配。 其他帖子詳細介紹了如何應對這種情況 ,如下所示。

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

rand的結果int ,這意味着您不能直接從中獲取12位數字。

如果需要始終為12位數字的值,則需要確保值適合特定范圍。

下面的示例假定您只需要一些數字為12位-您只需要8個額外的位-因此移位和運算結果將產生0x7fffffffff-0范圍內的數字,當打印為時,通常會產生多達12位的輸出十進制:

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

PS:確保將用於存儲結果的變量足夠大以存儲12位數字。

我生成隨機字符串或數字的簡單方法是:

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. 創建一個包含(數字,字母等)的字符數組
  2. 生成一個介於[0,數組長度]之間的隨機數,我們命名為X。
  3. 在字符數組中隨機獲取字符 X position。
  4. 最后,將此字符添加到您希望返回的字符串(或數字)序列中。

如何使用它?

#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM