ตัวสร้างเลขสุ่มเทียม

**ตัวสร้างเลขสุ่มเทียม** () คือตัวสร้างเลขสุ่มประเภทหนึ่ง มีความสำคัญในทางคณิตศาสตร์ การเข้ารหัส และการเสี่ยงโชค ตัวสร้างเลขสุ่มเทียมมีทั้งได้จากฮาร์ดแวร์ซึ่งเป็นการสุ่มแท้ และจากซอฟต์แวร์ซึ่งเป็นการสุ่มเทียม (pseudorandomness)

## คำอธิบาย
ตัวสร้างเลขสุ่มเทียมหรือที่รู้จักกันในชื่อตัวสร้างบิตสุ่มแบบกำหนดได้ (Deterministic random bit generator: DRBG) เป็นขั้นตอนวิธีสำหรับใช้ในการสร้างลำดับของตัวเลขที่มีความใกล้เคียงกับคุณสมบัติของการสุ่ม ถึงลำดับตัวเลขที่ได้จากขั้นตอนวิธีตัวสร้างเลขสุ่มเทียมนี้จะใกล้เคียงกับลำดับเลขสุ่มแท้จริง แต่ก็ไม่ได้เป็นลำดับตัวเลขแบบสุ่มที่แท้จริงเนื่องจากลำดับตัวเลขที่ได้ออกมาจากตัวสร้างเลขสุ่มเทียมทั้งหมดได้มาจากกลุ่มเล็ก ๆ ของค่าเริ่มต้นที่กำหนดให้เป็นตัวตั้งต้น (seed) ของตัวสร้างเลขสุ่มเทียม ถึงจะมีตัวสร้างเลขสุ่มจากฮาร์ดแวร์ที่สามารถนำมาสร้างลำดับสุ่มแท้ได้ แต่ลำดับสุ่มเสมือนที่ได้จากตัวสร้างเลขสุ่มเทียมเองก็มีความสำคัญในทางปฏิบัติหลาย ๆ อย่าง ทั้งในด้านการจำลอง เช่นระบบกายภาพที่ใช้วิธีมอนเตการ์โล ในด้านการเข้ารหัสลับ (cryptography) ในด้านการก่อกำเนิดกระบวนคำสั่ง (procedural generation) ส่วนใหญ่เกี่ยวข้องกับคอมพิวเตอร์กราฟิกส์ (โปรแกรมประยุกต์และวิดีโอเกมขั้นออกแบบ) ขั้นตอนวิธีเชิงสุ่มมากมายเองก็ได้อิทธิพลมาจากตัวสร้างเลขสุ่มเทียมเป็นส่วนหนึ่งในการแก้ปัญหา นอกจากการใช้งานแล้วการพิสูจน์ว่าตัวสร้างเลขสุ่มเทียมใช้งานได้จริงก็มีความสำคัญไม่แพ้กัน ซึ่งการพิสูจน์นี้ต้องอาศัยการวิเคราะห์ทางคณิตศาสตร์อย่างระมัดระวังในการทำให้แน่ใจได้ว่าตัวสร้างเลขสุ่มเทียมได้สร้างลำดับสุ่มเสมือนที่มีลักษณะสุ่มเพียงพอสำหรับการใช้งาน

## ประวัติ
right|250px|thumb|ตัวอย่างการวนซ้ำของวิธีมิดเดิลสแควร์
ตัวสร้างเลขสุ่มเทียมที่อาศัยคอมพิวเตอร์ยุคแรก ๆ คิดค้นโดย จอห์น ฟอน นอยมันน์ ในปี ค.ศ. 1946 รู้จักกันในนามของ วิธีมิดเดิลสแควร์ (middle-square method) ขั้นตอนวิธีนี้คือ รับตัวเลขใดเข้ามาเป็นตัวตั้งต้นก็นำตัวเลขนั้นมายกกำลังด้วย 2 แล้วนำหลักตรงกลางออกจากผลลัพธ์ที่ได้ ก็จะได้ตัวเลขสุ่มขึ้นมาตามต้องการ ซึ่งสามารถนำตัวเลขนี้มาเป็นตัวตั้งต้นในการสร้างตัวเลขสุ่มอื่น ๆ ต่อไปได้

## รหัสเทียม
Input เป็นตัวเลข 
Output ยกกำลังสอง Input ที่นำตัวเลขตำแหน่งกลางออก

```cpp
int main ()
 {
 int in;
 int tmp =in*in;
 int tmp2=tmp;
 //หาจำนวนหลัก
 int length=0;
 while (tmp2>0)
 {
 length++;
 tmp2/=10;
 }
 int tmp3=tmp/pow (10,length/2) ; //ดึงส่วนข้างหน้าหลักกลางออกมา
 int tmp4= (length%2==0) ?tmp-tmp3* pow (10,length/2) +1: tmp-tmp3* pow (10,length/2) ;//ดึงส่วนข้างหลังหลักกลางออกมา
 int out = tmp3* pow (10,length/2) +tmp4; ที่ นำหลักตรงกลางออกแล้ว
 return out;
 }
```

ปัญหาของ middle-square method คือท้ายที่สุดแล้วจะซ้ำกับลำดับสุ่มซึ่งสร้างขึ้นก่อนหน้า บางอันจะทำให้เกิดการวนซ้ำเร็วมากเช่น 00000 ซึ่งถ้านำไปทดลองทำตามวิธีนี้จะพบว่าได้ 0000000000 ทุกครั้ง ซึ่งฟอน นอยมันน์ ก็ตระหนักถึงปัญหาดังกล่าวเช่นกัน แต่เขาคิดว่ามันเพียงพอแล้วกับวัตถุประสงค์ในการใช้งานของเขา เขาได้ใช้กลวิธีการทางคณิตศาสตร์บางอย่างในการคาดเดาล่วงหน้าก่อนจะใส่เป็นตัวตั้งต้นซึ่งจะสามารถซ่อนข้อผิดพลาดดังกล่าวไว้ได้ ต่อมา middle-square method ถูกแทนที่จากวิธีการอื่นที่ซับซ้อนและมีความละเอียดอ่อนมากกว่าซึ่งลำดับสุ่มเสมือนที่ได้มีความใกล้เคียงลำดับสุ่มแท้จริงมากกว่า

## คาบการวนซ้ำ
ตัวสร้างเลขสุ่มเทียมเริ่มต้นจากสถานะเริ่มต้นอะไรก็ได้โดยใช้สถานะ seed (สถานะเริ่มต้น) เป็นตัวเริ่มต้นของตัวสร้างเลขสุ่มเทียม ซึ่งทำให้เกิดการวนซ้ำของลำดับได้โดยความยาวสูงสุดของลำดับสุ่มเสมือนก่อนเกิดการซ้ำเกิดขึ้นถูกวัดจากขนาดของสถานะซึ่งวัดได้โดยความยาวของบิต ความยาวคาบของการวนซ้ำสูงสุดจะยาวเพิ่มเป็น 2 เท่าทุก 1 บิตที่เพิ่มขึ้นจึงทำให้ง่ายที่จะสร้าง ตัวสร้างเลขสุ่มเทียมที่มีคาบการวนซ้ำที่ยาวเพียงพอสำหรับหลาย ๆ โปรแกรมในทางปฏิบัติ ถ้าสถานะของตัวสร้างเลขสุ่มเทียมมี n บิต คาบการวนซ้ำจะไม่ยาวเกินกว่า 2n เช่น เรจิสเตอร์เลื่อนป้อนกลับได้เชิงเส้นLinear Feedback Shift Registers (LFSRs) โดยปกติจะถูกทำให้มีคาบการวนซ้ำที่มีความยาวแน่นอนคือ 2n−1 ตัวสร้างสมภาคเชิงเส้นLinear congruential generators มีคาบการวนซ้ำซึ่งสามารถคำนวณได้จากการหาตัวประกอบ มิกซ์ Mixes (ไม่มีข้อบังคับ) มีคาบการวนซ้ำโดยเฉลี่ย 2n/2 มิกซ์ Mixes (ซึ่งสามารถย้อนกลับได้) มีคาบการวนซ้ำโดยเฉลี่ย 2n ถึงแม้ว่าตัวสร้างเลขสุ่มเทียมจะมีการซ้ำของผลลัพธ์หลังจากถึงคาบการวนซ้ำแต่การเจอตัวซ้ำไม่ได้หมายความว่ามันครบคาบการวนซ้ำเสมอไปเพราะคาบการวนซ้ำที่แท้จริงอาจจะยาวกว่านี้

## รายการ
thumb|ตัวอย่างของตัวสร้างเลขสุ่มเทียม Pseudo Random Generator Shift register
thumb|right|500 px|4 บิต Fibonacci LFSR พร้อมกับแผนภาพแสดงสถานะ
thumb|right|400 px|16 บิต Fibonacci LFS
thumb|right|400 px| 16 บิต Galois LFSR
* ตัวสร้างเลขสุ่มเทียมแบบบลัมบลัมชับ
* Inversive congruential generator
* ISAAC
* Lagged Fibonacci generator
* Linear congruential generators
* Linear Feedback Shift Registers (LFSRs)
* Mersenne twister
* Multiply-with-carry
* Naor-Reingold Pseudorandom Function
* Park–Miller random number generator
* Maximal periodic reciprocals
* Well Equidistributed Long-period Linear
* Xorshift Xorshift

### ขั้นตอนวิธีในการเข้ารหัสที่ใช้ตัวสร้างเลขสุ่มเทียม (PRNG)
* Block_ciphers ใน counter mode
* Cryptographic hash function in counter mode
* Stream ciphers

### PRNG APIS ที่มีชื่อเสียง
* Random class ใน the Java programming language
* SecureRandom class ใน the Java programming language

### PRNG ที่ใช้ External entropy
* CryptGenRandom - Microsoft Windows
* Fortuna_(PRNG)
* Yarrow_algorithm - Mac OS X and FreeBSD
* /dev/random - Linux and Unix
* LavaRnd - The open-source (LGPL) successor to Lavarand
* HotBits
* random.org

## ตัวอย่างขั้นตอนวิธีอย่างง่าย
### วิธีตัดกลางของผลคูณ (Midproduct Method)
* 1.) เลือกตัวเลขสี่หลัก 2 ค่า x'0 และ x0
* 2.) คูณค่า x'0 และ x0 เข้าด้วยกัน
* 3.) ใชสี่หลักกลางของผลคูณที่ได้ในข้อ 2.) เป็นตัวเลขสุ่มเทียม x1
* 4.) คูณ ค่า x0 และ x1
* 5.) ทำซ้ำขั้นตอน 3.) และ 4.) จนกว่าจะได้ตัวเลขสุ่มเท่าจำนวนที่ต้องการ
### วิธีตัวคูณคงที่ (Constant Multiplier Technique
* 1.) กำหนดค่าคงที่ k ขนาดสี่หลัก และค่าเริ่มต้น x0
* 2.) คูณค่า k และ x0 เข้าด้วยกัน
* 3.) ใชสี่หลักกลางของผลคูณที่ได้ในข้อ 2.) เป็นตัวเลขสุ่มเทียม x1
* 4.) คูณ ค่า k และ x1
* 5.) ทำซ้ำขั้นตอน 3.) และ 4.) จนกว่าจะได้ตัวเลขสุ่มเท่าจำนวนที่ต้องการ
### วิธีการบวกเศษเหลือ (Additive Congruent Method)
* 1.) กำหนดตัวเลขจำนวนเต็ม x1, x2,..., xn
* 2.) สร้าง xn+1, xn+2, ... จากตัวเลขในข้อ 1.)
* 3.) สร้างตัวเลขสุ่มเทียมโดยใช้สูตร
* xi= (xi-1+xi-n) (mod m)
* Ri-n= xi/m

### วิธีการใช้เศษเหลือ (Congruent Method)
* วิธีการที่นิยมใช้ที่สุดในการสร้างตัวเลขแบบสุ่มคือการใช้เศษเหลือของผลคูณ (Multiplicative Congruential Method)
* โดยใช้สูตร xi+1 =axi (mod m)
* ด้วยการกำหนดค่าให้ a และ m ซึ่งจะต้องไม่เป็นค่าลบและกำาหนดค่าเริ่มต้น x0

## เวลาในการทำงาน หน่วยความจำที่ใช้ หรือการพิสูจน์ความถูกต้อง
* ขึ้นกับแต่ละขั้นตอนวิธีเพราะขั้นตอนวิธีต่างกันจะมีเวลาในการทำงานและหน่วยความจำที่ใช้ต่างกัน การพิสูจน์ความถูกต้องของตัวสร้างเลขสุ่มเทียมแต่ละขั้นตอนวิธีก็ต่างกันด้วย

## ปัญหา
* คาบเวลาการซ้ำสั้นกว่าที่คาดเอาไว้สำหรับบางสถานะ seed (สถานะเริ่มต้น) 
* ขาดเอกรูป (Non-Uniform) ในการแจกแจงลำดับสุ่มเสมือนที่สร้างขึ้นมาเมื่อสร้างตัวเลขสุ่มมาแล้วเป็นจำนวนมาก 
* เกิดความสัมพันธ์กับค่าที่อยู่ติดกันซึ่งอาจทำให้ผู้โจมตีสามารถคาดเดาตัวต่อไปได้
* การแจกแจงที่มีมิติหรือขอบเขตที่ไม่ดี (poor dimension) ในลำดับสุ่มเสมือนที่ได้จากตัวสร้างเลขสุ่มเทียม [thumb|right|ปริภูมิ 3 มิติ ของ 100,000 ค่าที่สร้างขึ้นมาด้วย แรนดู[:en:RANDU|RANDU โดยจุดแต่ละจุดแสดง 3 ลำดับย่อยของตัวเลขสุ่มเทียม]]
จุดบกพร่องเหล่านี้มีตั้งแต่ไม่สามารถสังเกตเห็นได้จนกระทั่งสามารถเห็นได้อย่างชัดเจน ตัวอย่างหนึ่งก็คือแรนดู RANDU ซึ่งเป็นขั้นตอนวิธีในการสร้างเลขสุ่มเทียมที่ใช้กันมากว่าทศวรรษบนคอมพิวเตอร์ mainframe ซึ่งไม่สมบูรณ์แบบ แต่เนื่องด้วยในสมัยนั้นวิทยาการในการตรวจสอบที่มียังมีไม่เพียงพอ ทำให้ความไม่สมบูรณ์แบบดังกล่าวไม่ถูกตรวจพบเป็นระยะเวลายาวนาน อีกตัวอย่างหนึ่งของปัญหาก็คือการวิจัยในหลาย ๆ สาขาในช่วงเวลาดังกล่าวซึ่งอาศัยการเลือกแบบสุ่ม การจำลองแบบวิธีมอนเตการ์โล หรือในทางอื่น ๆ ได้ผลการวิจัยที่มีความน่าเชื่อถือน้อยกว่าที่ควรจะเป็น

## กับการเข้ารหัส
ลำดับสุ่มเสมือนส่วนใหญ่ที่ได้จากขั้นตอนวิธีตัวสร้างเลขสุ่มเทียมเป็นหนึ่งในแกนกลางทั้งทางทฤษฏีและทางปฏิบัติของการเข้ารหัส (Cryptography) 
ไม่ว่าจะมีวิธีการหรือไม่มีวิธีการในการจำแนกลำดับสุ่มเสมือนคุณภาพสูงของตัวสร้างเลขสุ่มเทียมออกจากลำดับสุ่มแท้จริงโดยที่ยังไม่รู้ขั้นตอนวิธีที่ใช้และยังไม่รู้สถานะเริ่มต้นที่ใช้ 

ความมั่นคงและระเบียบวิธีการในการเข้ารหัสของขั้นตอนวิธีตัวสร้างเลขสุ่มเทียม มีใช้กันส่วนมากตั้งอยู่บนสมมุติฐานที่ว่าเป็นไปไม่ได้ที่จะแยกลำดับสุ่มเสมือนจากการใช้งานของตัวสร้างเลขสุ่มเทียมที่เหมาะสมออกจากลำดับสุ่มแท้จริงได้  ตัวอย่างหนึ่งที่เห็นได้ชัดคือ กระแสข้อมูลรหัส (stream ciphers) ซึ่งส่วนมากทำงานโดยใช้ตัวดำเนินการทางตรรกศาสตร์ exclusive or (XOR) ระหว่างข้อความปกติกับผลลัพธ์จากตัวสร้างเลขสุ่มเทียมผลิตข้อความรหัส (ciphertext) ออกมา การออกแบบตัวสร้างเลขสุ่มเทียม  ที่สามารถเข้ารหัสได้อย่างเพียงพอต่อความต้องการในปัจจุบันนี้เป็นสิ่งที่ยากอย่างสุดสุดเพราะว่า ตัวสร้างเลขสุ่มเทียม ที่ออกแบบนี้นอกจากจะต้องสอดคล้องกฎเกณฑ์ข้อกำหนดพื้นฐานสำหรับตัวสร้างเลขสุ่มเทียมทั่วไปที่ไม่ได้ใช้เข้ารหัสแล้วยังต้องสอดคล้องกับกฎเกณฑ์ข้อกำหนดต่าง ๆ เพิ่มเติมเพื่อเป็นเครื่องยืนยันว่าสามารถใช้เข้ารหัสได้อย่างเพียงพอ

## ในการเข้ารหัสที่ปลอดภัย
ตัวสร้างเลขสุ่มเทียมที่เหมาะสำหรับใช้งานในการเข้ารหัส เรียกว่าตัวสร้างเลขสุ่มเทียมที่มีความมั่นคงเชิงรหัส cryptographically secure PRNG (CSPRNG)  ขณะที่ตัวสร้างเลขสุ่มเทียมทั่ว ๆ ไปนั้นแค่ผ่านการทดสอบทางสถิติจำนวนหนึ่งก็พอ ส่วนตัวสร้างเลขสุ่มเทียมที่มีความมั่นคงเชิงรหัสต้องผ่านการทดสอบทางสถิติทั้งหมดและต้องอยู่ภายในเวลาแบบฟังก์ชันพหุนามกับขนาดของค่าเริ่มต้น (seed) ถึงแม้ว่าคุณสมบัติดังกล่าวจะไม่สามารถพิสูจน์ได้ในทางปฏิบัติก็ตาม เรายังสามารถแสดงหลักฐานข้อพิสูจน์ที่แข็งแรงเพียงพอให้เห็นได้ว่าตัวสร้างเลขสุ่มเทียมที่สร้างขึ้นมีความมั่นคงเชิงรหัสหรือไม่ โดยลดรูปคุณสมบัติดังกล่าวไปสู่ปัญหาที่ยากทางคณิตศาสตร์ที่เป็นที่รู้จักกันซึ่งเป็นหนึ่งในกลุ่มปัญหา NP เช่นการแยกตัวประกอบจำนวนเต็มที่มีหลาย ๆ หลัก โดยปกติแล้วต้องใช้เวลาหลายปีในการตรวจสอบกว่าจะสามารถยืนยันได้ว่าขั้นตอนวิธีตัวสร้างเลขสุ่มเทียมใด ๆ นั้นจะเป็นตัวสร้างเลขสุ่มเทียมที่มีความมั่นคงเชิงรหัสหรือไม่

### รายการของตัวสร้างเลขสุ่มเทียมที่มีความมั่นคงเชิงรหัส (CSPRNG)
* Stream ciphers
* Block ciphers วิ่งใน counter หรือ output feedback mode
* ตัวสร้างเลขสุ่มเทียมที่ออกแบบมาเป็นอย่างดีสำหรับการเข้ารหัสโดยเฉพาะ
** Microsoft's Cryptographic Application Programming Interface function CryptGenRandom
** Yarrow algorithm (incorporated in Mac OS X and FreeBSD)
** Fortuna
* การผสมระหว่างขั้นตอนวิธีตัวสร้างเลขสุ่มเทียมดั้งเดิมหลาย ๆ ตัวโดยมีเป้าหมายในการกำจัดลำดับที่ดูเหมือนไม่ได้สุ่มออกไป
* การออกแบบขั้นตอนชนิดพิเศษที่ตั้งอยู่บนสมมุติฐานอย่างยากทางคณิตศาสตร์เช่น Micali-Schnorr, ขั้นตอนวิธี Blum Blum Shub ซึ่งได้พิสูจน์ความมั่นคงของรหัสได้เป็นอย่างดีไว้แล้ว ขั้นตอนวิธีเหล่านี้จะใช้เวลาช้ากว่าตัวสร้างเลขสุ่มเทียมแบบอื่นและใช้งานไม่ได้ในทางปฏิบัติด้านอื่น ๆ นอกจากใช้ในการเข้ารหัสเท่านั้น

## BSI evaluation criteria
หน่วยงานความมั่นคงทางสารสนเทศของเยอรมัน (The German Federal Office for Information Security: BSI) ได้จัดตั้งกฎเกณฑ์ในการกำหนดคุณภาพของตัวสร้างเลขสุ่มเทียมขึ้นดังนี้
* K1 ลำดับสุ่มเสมือนซึ่งมีโอกาสต่ำที่หลักที่อยู่ติดกันจะมีค่าซ้ำกัน
* K2 ลำดับสุ่มเสมือนซึ่งไม่สามารถแยกจากลำดับสุ่มแท้จริงด้วยการทดสอบทางสถิติที่แน่ชัด การทดสอบโมโนบิต monobit test (จำนวนที่เท่ากันของเลขศูนย์และเลขหนึ่งในลำดับ), การทดสอบโปกโกอร์ poker test (ตัวอย่างพิเศษของ chi-square test), การทดสอบการวิ่งruns test (นับจำนวนความถี่ของการวิ่งของความยาวที่ต่าง ๆ กัน), การทดสอบการวิ่งระยะยาว longruns test (ตรวจสอบการวิ่ว่ามี ความยาวมากกว่า 34 or หรือใหญ่กว่า 20 000 bits ในลำดับหรือไม่ — both from BSI2 (AIS 20, v. 1, 1999) and FIPS (140-1, 1994), และ การทดสอบความผิดพลาดอันเนื่องมากจากความสัมพันธ์autocorrelation test ใจความสำคัญของการทดสอบเหล่านี้คือลำดับย่อยใด ๆ ที่เลือกมาจะต้องไม่มีข้อมูลใดของตัวถัดไปของลำดับปรากฏอยู่ 
* K3 สำหรับในทางปฏิบัติเป็นไปไม่ได้ที่ผู้โจมตีใด ๆ จะคำนวณหรือเดาตัวเลขสุ่มได้จากลำดับย่อยใด ๆ ที่ได้มา ตัวก่อนหน้าหรือตัวถัดไปของลำดับหรือจากสถานะใด ๆ ของตัวสร้างเลขสุ่มเทียม
* K4 สำหรับในทางปฏิบัติเป็นไปไม่ได้ที่ผู้โจมตีใด ๆ จะคำนวณหรือเดาตัวเลขสุ่มได้จาก สถานะภายในของตัวสร้างเลขสุ่มเทียม ตัวก่อนหน้าหรือตัวถัดไปของลำดับหรือสถานะก่อนหน้าใด ๆ ของ ตัวสร้างเลขสุ่มเทียม
สำหรับโปรแกรมในการเข้ารหัสตัวสร้างเลขสุ่มเทียม (PRNG) ที่ครบตามเงื่อนไขของมาตรฐาน K3 หรือ K4 เท่านั้นที่ยอมรับได้ว่าเป็นตัวสร้างเลขสุ่มเทียมที่มีความมั่นคงเชิงรหัส (CSPRNG)

## การใช้งาน
### การแจกแจงไม่เอกรูป (Non-Uniform Distribution)
ตัวเลขที่เลือกมาจากการแจกแจงความน่าจะเป็นที่ไม่เอกรูปสามารถสร้างโดยใช้การแจกแจงเอกรูป (uniform distribution ) ตัวสร้างเลขสุ่มเทียม PRNG และ function ที่เกี่ยวข้องกับการแจกแจง 2 ประเภท
#### 1: [[:en:Cumulative_distribution_function|cumulative distribution function]] <math>F (b) </math> ของ<math>f (b) </math>:
:F (b) =\int_{-\infty}^b f (b') db'
0=F (-\infty) \leq F (b) \leq F (\infty) =1.
เลือก c แบบสุ่มจากการแจกแจงเอกรูปและหาความหนาแน่นของความน่าจะเป็นจะได้
:F (b) =c
ดังนั้น
:b=F^{-1} (c) 
คือตัวเลขแบบสุ่มที่ได้จากการแจกแจงf (b) .
#### 2: ตัวผกผัน Cumulative Gaussian distribution
\operatorname{erf}^{-1} (x) 
พร้อมกับ ตัวสร้างเลขสุ่มเทียม เอกรูปแบบอุดมคติในช่วง (0, 1) เป็น input x จะให้ลำดับของค่าบวกซึ่งเป็นการแจกแจงแบบ Gaussian distribution ออกมา
* เมื่อใช้ในทางปฏิบัติการแสดงตัวเลขจะต้องมีการตัดหางที่ยาวไม่มีที่สิ้นสุดของการแจกแจงให้เป็นค่าที่มี่ที่สิ้นสุด 
* การคำนวณซ้ำหลายครั้ง\operatorname{erf}^{-1} (x) ควรลดให้เป็นแบบ Ziggurat algorithm เพื่อความเร็วที่มากขึ้นของการสร้างด้วยหลักการคล้ายกับการแจกแจงเรย์ลี (Rayleigh distribution) และการแจกแจงปัวซง (Poisson distribution) ก็สามารถนำมาใช้ในการสร้างการแจกแจงแบบไม่เป็นเอกรูปได้เช่นกัน

### โปรแกรมประยุกต์และการประยุกต์ใช้งานในด้านอื่น ๆ
* KeyPass
* QFX keyscramble
* โปรแกรมสุ่มเลขบัตรประจำตัวประชาชน-สุ่มเลขบัตรประชาชนสำหรับใช้ในการสมัครสมาชิกเว็บต่าง ๆ เพื่อความปลอดภัยของผู้สมัครสมาชิก
* Passward Generator
* การพยากรอากาศ
* การทำนายอนาคต
* GPS สามารถหาเวลาที่ต่างกันระหว่างเครื่องรับกับดาวเทียมได้อย่างมีประสิทธิภาพและมีราคาไม่แพงทำให้กลายเป็นเครื่องมือที่ทุกคนสามารถใช้ได้ 
* การโคจรของดาวเทียม ดาวเทียมทุกดวงสามารถใช้คลื่นความถี่เดียวกันได้โดยไม่เกิดการรบกวนต่อกัน ดาวเทียมแต่ละดวงจะมี Pseudo Random code เป็นของเฉพาะตัว ดังนั้นเวลาเครื่องรับนำรหัสมาใช้ต้องให้ถูกตามหมายเลขดาวเทียม
* ทฤษฏีความโกลาหล (Chaos theory) ปรากฏการณ์ที่ดูเหมือนว่าเกิดขึ้นอย่างสะเปะสะปะแต่แฝงไปด้วยความเป็นระเบียบ
* วิธีการชนะที่รูเล็ตคาสิโนออนไลน์จากจุดบกพร่องของตัวสร้างเลขสุ่มเทียมของคาสิโนออนไลน์

## ดูเพิ่ม
* Pseudorandom binary sequence
* Random number generator attack
* Quisi random
* Pseudorandom generator theorem
* Pseudorandom function
* Chaos theory

## อ้างอิง
*  Michael Luby, Pseudorandomness and Cryptographic Applications, Princeton Univ Press, 1996. A definitive source of techniques for provably random sequences. 
*  Donald Knuth. The Art of Computer Programming, Volume 2: Seminumerical Algorithms, Third Edition. Addison-Wesley, 1997. ISBN 0-201-89684-2. Chapter 3, pp. 1–193. 
Extensive coverage of statistical tests for non-randomness. 
*  R. Matthews Maximally Periodic Reciprocals Bulletin of the Institute of Mathematics and its Applications 28 147-148 1992 
*  J. Viega, Practical Random Number Generation in Software, in Proc. 19th Annual Computer Security Applications Conference, Dec. 2003. 
*  John von Neumann, "Various techniques used in connection with random digits," in A.S. Householder, G.E. Forsythe, and H.H. Germond, eds., Monte Carlo Method, National Bureau of Standards Applied Mathematics Series, 12 (Washington, D.C.: U.S. Government Printing Office, 1951) : 36-38. 
*  NIST Recommendation for Random Number Generation Using Deterministic Random Bit Generators 
*  Luc Devroye (1986). Non-Uniform Random Variate Generation. New York: Springer-Verlag.
*  http://www.tuct.ac.th/Computer/sm/Chapter3.pdf 
*  http://www.gpsthaionline.com/index.php?option=com_content&view=article&id=96:gps-pseudo-random-code&catid=26:gps-articles&Itemid=57 
*  http://www.slideshare.net/ApplesMountain/chaos-theory-4968454
*  http://www.shmatsunaga.com/?p=395

หมวดหมู่:ขั้นตอนวิธี
หมวดหมู่:ตัวสร้างเลขสุ่มเทียม