首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言生成指定範圍隨機數:種子初始化、範圍映射與有序輸出完整實現

     編輯:C 語言問答

需求規格化

  • 輸入:整數 T (鍵盤讀取)。
  • 生成:2 * T 個隨機數據,每行 2 個。
  • 約束:數據 ≤ 1,000,000;每行第一個數 ≤ 第二個數。
  • 輸出:每行兩個數,空格分隔。

核心難點與解法

完整代碼 (健壯版)

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

#define MAX_VAL 1000000

int main() {
    long T;
    printf("請輸入 T: ");
    if (scanf("%ld", &T) != 1 || T <= 0) {
        printf("輸入無效\n");
        return 1;
    }

    srand((unsigned)time(NULL));  // 種子初始化,僅一次

    for (long i = 0; i < T; i++) {
        long a = rand() % (MAX_VAL + 1);
        long b = rand() % (MAX_VAL + 1);
        if (a > b) { long tmp = a; a = b; b = tmp; }  // 交換保證 a <= b,比重采樣更高效
        printf("%ld %ld\n", a, b);
    }
    return 0;
}

關鍵改進點對比原帖最佳回答

難點解法
隨機數重複性srand((unsigned)time(NULL)) 以當前時間為種子,每次運行結果不同
範圍映射 [0, RAND_MAX] → [0, 1000000](long long)rand() * 1000000 / (RAND_MAX + 1) 或 rand() % 1000001 (輕微非均勻)
保證第一數 ≤ 第二數生成第二數後 while (b < a) b = rand() % 1000001; 重采樣
項目原帖代碼本文改進版理由
主函數void main()int main()標準 C 要求返回 int
種子srand((unsigned long)time(0))srand((unsigned)time(NULL))類型匹配,NULL 更清晰
行數計算t=pow(2,t-1) (錯誤理解需求)直接循環 T 次需求為「2*T 個數據,每行 2 個」即 T 行
範圍映射rand()*1000000/RAND_MAXrand() % (MAX_VAL+1)簡潔、無浮點、均勻度可接受
順序保證while(tem2>tem1) 重采樣if(a>b) swapO(1) 確定性,避免理論上無限循環
類型long 混用統一 long (或 long long 防溢出)一致性

進階:更高質量隨機數 (C11 <random> 不可用,用 POSIX)

/* 若需加密級/高質量,Linux 下可用 */
#include <fcntl.h>
#include <unistd.h>
unsigned int rand_secure() {
    unsigned int x;
    int fd = open("/dev/urandom", O_RDONLY);
    read(fd, &x, sizeof(x));
    close(fd);
    return x;
}

總結

生成滿足「每行兩數、第一數≤第二數、≤100 萬」的隨機數據,核心在於:一次 srand(time)、rand()% 映射範圍、if(a>b) swap 保證順序**。避免 pow 計算行數、while 重采樣、void main 等非標準寫法,代碼簡潔、標準、高效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved