เรื่องวุ่นๆ ของการสุ่มค่า ตอนที่ 1
ฟังก์ชั่นในการสุ่มเลข ที่สามารถใช้ได้ทั้งในการเขียนโปรแกรมบนดอส หรือวินโดวส์ก็คือ rand ฟังก์ชั่นนี้ ถ้าจะให้สุ่มไม่ซ้ำกันให้เรียกใช้ srand ก่อน จากนั้นจึงเรียกใช้ rand( ) ตามด้วยเครื่องหมาย % และตัวเลขที่จะให้สุ่มอยู่สูงสุด ดังตัวอย่างต่อไปนี้
#include "stdio.h"
#include "time.h"
#include "stdlib.h"
void main()
{
srand(unsigned(time(NULL)));
for (int i=0;i<10;i++)
{
printf("%d\n",rand()%10);
}
}
RUN
6
7
1
2
6
9
8
5
0
2
ถ้าจะให้การสุ่มนั้นอยู่ในขอบเขตที่ต้องการ เช่น อยู่ระหว่าง 10-20 เท่านั้น เราก็จะใช้วิธีการบวกเข้าไป คือ เราต้องการให้อยู่ระหว่าง 10-20 เราก็จะบวกเข้าไป 10
for (int i=0;i<10;i++)
{
printf("%d\n",rand()%10+10);
}
จากตัวอย่าง ผลที่ได้จากการสุ่มจะไม่เกิน 20 เพราะเมื่อมันสุ่มออกมาเป็นหลักหน่วย มันก็จะบวกอีก 10 ทำให้กลายเป็นสิบกว่าๆ ไม่เกิน 20 (รวมเลข 10 ด้วย ถ้าไมต้องการให้รวมเลข 10 ให้เริ่มตั้งแต่ 11 ก็ให้บวกอีก 11)
การสุ่มตัวเลขด้วย rand นั้น ใช้ได้ทั้งการประมวลผลภายในคลาส ภายในฟังก์ชั่น เพื่อให้เกิดตัวเลขที่ต้องการ หรือจะนำไปใช้ในการเขียนโปรแกรมบนวินโดวส์ด้วยก็ได้ ไม่ว่าจะเป็นการเขียนบน Win32 API หรือ MFC ดังตัวอย่างต่อไปนี้
จากตัวอย่าง เป็นโปรแกรมแบบ Dialog-based เขียนด้วย C++ และ MFC โดยเราจะสั่งให้วาดภาพบนหน้าไดอะล็อกเป็นเส้นๆ ไปๆ มาๆ โดยเราจะเรียกฟังก์ชั่น srand ใน OnInitDialog และใน OnPaint ก็จะสั่งให้วาดภาพออกไปพร้อมกับสุ่มค่าตำแหน่ง ดังตัวอย่างนี้
BOOL CTestMFCDlg::OnInitDialog()
{
srand(unsigned(time(NULL)));
return TRUE;
}
void CTestMFCDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
..
}
else
{
CPaintDC pDC(this); // device context for painting
CPen pen1;
pen1.CreatePen(PS_SOLID,1, RGB(0,0,0));
pDC.SelectObject(&pen1);
for (int i=0;i<50;i++)
{
int x1=rand()%300;
int y1=rand()%200;
int x2=rand()%300;
int y2=rand()%200;
pDC.MoveTo(x1,y1);
pDC.LineTo(x2,y2);
}
CDialog::OnPaint();
}
}
Back Next
|