หน้าแรก > Academic, Scientific Tools > Random Gaussian Number Generator

Random Gaussian Number Generator

โปรแกรมสุ่มตัวแปรที่มีการกระจายตัวแบบเกาส์เชียน(Gaussian Distribution) เหมาะสำหรับการนำไปคำนวณผลการอินติเกรตเชิงตัวเลข(numerical integration) ด้วย Monte Carlo Method หรือกระบวนการเชิงสถิติอื่นๆ ที่ต้องใช้การกระจายตัวแบบเกาสเชียน 

โปรแกรมตัวนี้มาจาก code  function  gasdev()  ภายในหนังสือ Numerical Recipes in C   2nd Edition  ของCambridge University Press เพียงแต่  ฟังก์ชันนี้เขียนขึ้นมาสำหรับ  Gaussian Distribution ที่มีค่าเฉลี่ย mean = 0 และ Standard Deviation = 1.0

float gasdev(idum1)
long *idum1;
{
float ran(long *idum);


static int iset=0;
static float gset;
float fac,rsq,v1,v2;
if (*idum1 < 0) iset=0;
if (iset == 0)
   {
      do {
          v1=2.0*ran(idum1)-1.0;
          v2=2.0*ran(idum1)-1.0;
          rsq=v1*v1+v2*v2;
         } while (rsq >= 1.0 || rsq == 0.0);

      fac=sqrt(-2.0*log(rsq)/rsq);
      gset=v1*fac;
      iset=1;
      return v2*fac;
   } else {
            iset=0;
            return gset;
          }
}

 

ฟังก์ชันนี้ต้องใช้คู่กับ function  สุ่มตัวเลขที่ให้ค่าผลลัพธ์  0 ถึง 1 ที่ให้ความน่าจะเป็นเท่าเทียมกันหรือ uniform number generator  ภายในฟังก์ชัน ran()

เวลาใช้อย่าลืมกำหนด seed(ตัวเลขอะำไรก็ได้ แต่ควรเปลี่ยน seed ทุกครั้งหากต้องการสุ่มค่าใหม่) และ  แทนค่าแอดเดรสหรือตำแหน่งใน Memory ที่เก็บค่าของ seed ลงไปแทนค่า idum ของ gasdev  ด้วย  gasdev(&seed)

เวลาใช้งาน สมมติเราต้องการให้ x เป็นผลจากการสุ่มด้วย gasdev()   โดยมีค่าเฉลี่ย(mean) m และ ค่าความคลาดเคลื่อนมาตรฐาน(standart deviation) ต้องพิมพ์ว่า

x =  m+ s*gasdev(&seed)

ก็จะได้ x มา ซึ่งหากต้องการสุ่มมาสัก 10,000 ค่า เราต้องเปลี่ยนค่าของ seed ทั้ง 10,000 ค่าด้วย ไม่เช่นนั้น เราจะได้ตัวเลขเดิมตลอดเวลา  เนื่องจากโปรแกรมสุ่มนี้ไม่ใช่การสุ่มอย่างแท้จริงแต่เป็น Pseudo Random หรือการสุ่มแบบเทียมเท่านั้น

About these ads
Categories: Academic, Scientific Tools
  1. ยังไม่มีความเห็น
  1. No trackbacks yet.

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

ติดตาม

Get every new post delivered to your Inbox.

%d bloggers like this: