阿賢在上一篇裡簡單的介紹如何起始srand()及使用rand()函數,接下來要說說如何從基本函數rand()變化出最常使用的兩種「固定範圍均勻亂數」。

[1.] 產生 0.0 <= frand() < 1.0 的浮點數亂數( frand()為自訂函數 )
  frand = rand()/((float)RAND_MAX+1),或
  frand = rand()/((double)RAND_MAX+1)

[2.] 產生 0 <= random(n) <= n 的整數亂數( random(n)為自訂函數 )
  random = rand()%(n+1),或是使用frand()
  random = (int)(frand()*(n+1))

  有了上面兩種基本型後,就能用來做進一步的變化:

[s1] 產生 a <= k <= b 的整數亂數:
  k = a + random(b-a),或是直接展開
     k = a + rand()%(b-a+1)
     k = a + (int)(frand()*(b-a+1))
[s2] 產生 a <= f < b 的浮點數亂數:f = a + frand() * (b-a)。
[s3] 產生 -a <= f < a 的浮點數亂數:f = a * ( frand() * 2 - 1 )。

  兩種基本型加上三種衍生型,就能應付大多"固定範圍內均勻亂數"的case。下面阿賢用幾個經典的亂數題目示範亂數用法。

一、蒙地卡羅法(Monte Carlo Method)求圓周率
二、產生不重複樂透號碼


第一次使用亂數就上手-目錄for C語言:

  第一次使用亂數就上手 - 1. 即用篇for C
  第一次使用亂數就上手 - 2. 基本篇for C
    基本篇範例一:蒙地卡羅法(Monte Carlo Method)求圓周率
    基本篇範例二:產生不重複樂透號碼
  第一次使用亂數就上手 - 3. 推廣篇for C
    產生常態分布亂數
    RAND_MAX的試煉:原理x限制x修正
  第一次使用亂數就上手 - 4. 原理篇for C
  第一次使用亂數就上手 - 5. 基本篇for C


創作者介紹
創作者 latinboy 的頭像
latinboy

阿賢的部落格

latinboy 發表在 痞客邦 留言(1) 人氣()