<%
' เรียกไปยังฟังค์ชั่นในการสุ่มหมายเลขบัตรประชาชนเลยทันที
Call RandomNumber
%>
<h1>ASP Script การสุ่มหมายเลขบัตรประชาชน - www.g2gnet.com</h1>
<form name="frmRandom" method="post" action="">
<% Response.Write RandomNumber %>
<input type="submit" name="cmdRandom" id="cmdRandom"
value="สุ่มหมายเลขบัตรประชาชน" onClick="Call RandomNumber()">
</form>
<%
' ########################################################
Function RandomNumber
' ########################################################
' เริ่มต้นในการสุ่มตัวเลขก่อน
Randomize
' สูตรการสุ่มตัวเลข เมื่อ High = ค่าสูงสุด และ Low = ค่าต่ำสุด
'RandomNumber = Int((High - Low + 1) * Rnd) + Low
' ตั้งค่าเป็น False ไว้ก่อน
blnFlag = False
' สุ่มเลขจำนวน 12 หลัก โดยที่หลักแรกต้องไม่ใช่ 0 และ 9
' เนื่องจากเราใช้การนับเริ่มต้นจาก 1 ไปสิ้นสุดที่ 12 โดยมีค่าเพิ่มขึ้นทีละ 1 เหมาะสมที่จะใช้ For
For i = 1 To 12
' Not False หรือ ไม่จริง ก็คือ เท็จ (หรือเขียน blnFlag = False) ...
' แสดงว่าตอนนี้เรากำลังจะหาตัวเลขหลักแรกอยู่
If Not blnFlag Then
' สุ่มตัวเลขหลักแรก ต้องไม่ให้มีค่าเป็น 0 และ 9 ... นี่คือการทำซ้ำ หรือ Repetitive
' ใช้การวนรอบ (Loop) แบบ For จะไม่เหมาะสมสำหรับงานนี้
' เพราะเราไม่รู้ค่าเริ่มต้น ค่าสิ้นสุด และ ค่าเพิ่ม (หรือลด)
' แต่มันก็นำมาใช้ได้เหมือนกันน่ะครับ เพราะมันมีคำสั่งให้ออกจาก Loop ด้วย Exit For อยู่
Do
' สุ่มหาตัวเลข 0 - 9 ... หากได้ 0 หรือ 9 ต้องสุ่มตัวเลขใหม่
RandomNumber = Int((9 + 1) * Rnd)
' ทำจนกว่าหลักแรกต้องไม่เท่ากับ 0 และ 9 (เงื่อนไขต้องใช้ AND)
' เช่น เมื่อ RandomNumber มีค่า = 1
' ทำให้ได้เงื่อนไข 1 <> 0 และ 1 <> 9 (True AND True = True)
' เงื่อนไขเป็น "จริง" ให้ออกจาก Loop
' หรือ เมื่อ RandomNumber มีค่า = 9
' ทำให้ได้เงื่อนไข 9 <> 0 และ 9 <> 9 (True AND False = False)
' เงื่อนไขเป็น "เท็จ" ให้วน Loop ต่อไป
Loop Until RandomNumber <> 0 And RandomNumber <> 9
' หรือ ใช้เงื่อนไข Until แต่กลับกันด้วย Not
'Loop Until Not RandomNumber = 0 And Not RandomNumber = 9
' หรือใช้ While แต่เงื่อนไขต้องกลับกันกับแบบ Until และต้องใช้ OR แทนที่
' เช่น เมื่อ RandomNumber มีค่า = 1
' ทำให้ได้เงื่อนไข 1 = 0 หรือ 1 = 9 (False OR False = False)
' เงื่อนไขเป็น "เท็จ" ให้ออกจาก Loop
' หรือ เมื่อ RandomNumber มีค่า = 9
' ทำให้ได้เงื่อนไข 9 = 0 หรือ 9 = 9 (False OR True = True)
' เงื่อนไขเป็น "จริง" ให้วน Loop ต่อไป
'Loop While RandomNumber = 0 Or RandomNumber = 9
' แจ้งว่าหลักแรกหาตัวเลขที่ไม่ใช่ 0 หรือ 9 เสร็จสมบูรณ์แล้ว
' หลักต่อไปจะได้ไม่ต้องเข้าไป Do Loop อีก
blnFlag = True
' Flag ตัวนี้จะเปลี่ยนเป็น False เมื่อหาตัวเลขหลักต่อไป
blnCheck = True
End If
' หาก blnFlag เป็นจริง และ blnCheck เป็นจริง แสดงว่าพึ่งหลุดออกจาก Loop Do While
If blnFlag And blnCheck Then
' จากหลักที่ 2 - 12 ต้องไม่ให้กลับมาในส่วนนี้อีก ให้ลงไปทำที่ Else เลย
blnCheck = True
Else
RandomNumber = RandomNumber & Int((9 + 1) * Rnd)
End If
Next
' ########################################################
' เริ่มต้นคำนวณหาค่าผลรวมตัวเลขทั้ง 12 หลักแรกที่ได้ ดังนี้
' หาผลรวมตั้งแต่หลักที่ 1 ไปจนถึงหลักที่ 12 (นับจากซ้ายไปขวา)
' โดยให้หลักที่ 1 คูณด้วยน้ำหนักประจำหลัก = 13
' โดยให้หลักที่ 2 คูณด้วยน้ำหนักประจำหลัก = 12
' โดยให้หลักที่ 3 คูณด้วยน้ำหนักประจำหลัก = 11
' โดยให้หลักที่ .. คูณด้วยน้ำหนักประจำหลัก = ..
' โดยให้หลักที่ 12 คูณด้วยน้ำหนักประจำหลัก = 2
' จากนั้นนำผลการคูณของแต่ละหลักมารวมกันเข้าไป
' หลักแต่ละหลัก คือ Mid(RandomNumber, Count, 1))
' น้ำหนักของแต่ละหลัก คือ (14 - Count) เมื่อ Count เริ่มต้นจาก 1 ไปสิ้นสุดที่ 12
' ดังนั้นค่านี้ (14 - Count) จึงเริ่มต้นค่าจาก 13, 12, 11, ..., สิ้นสุดที่ 2 ครับผม
Sum = 0 ' Clear ค่าผลรวมก่อน (เพื่อความแน่ใจ)
For Count = 1 To 12
Sum = Sum + Mid(RandomNumber, Count, 1) * (14 - Count)
Next
' ########################################################
' ขั้นตอนนี้ คือ การหาค่า Check Digit หรือ หลักตรวจสอบความถูกต้อง (หลักที่ 13)
' นำผลรวมที่ได้ (Sum) มา Mod (การหารเอาเศษ) ด้วย 11
' นั่นคือค่าที่เราจะได้ก็คือ 0, 1, 2, .. , 10 (Sum Mod 11)
' จากนั้นให้ลบออกด้วย 11 ก็จะทำให้ได้ค่าตั้งแต่ 1, 2, 3, ... , 11 (11 - (Sum Mod 11))
' แล้วให้เลือกตัวขวามือสุดมาหนึ่งตัว ด้วยคำสั่ง Right$ --> Right$(Str(11 - (Sum Mod 11)), 1)
' ค่าสุดท้ายนี้ก็คือ หลักที่ 13 หรือ หลักตรวจสอบความถูกต้อง (Check Digit) นั่นเอง
CheckDigit = Right(11 - (Sum Mod 11), 1)
' ########################################################
' ########################################################
' เอาค่ามาจัดเรียงเพื่อนำไปใช้ในการสมัครเล่นเกมส์ต่อไป ... 55555+
'
RandomNumber = RandomNumber & CheckDigit
'
' ########################################################
End Function
%>
Conclusion: เรียกได้ว่า VB มันจะมาคู่กันกับ ASP เลยก็ว่าได้ แล้วยิ่งผสมผสานกับการอ่าน Tag ของ HTML ได้ด้วย (ก็ทำเว็บได้นั่นแหละครับ) ก็ยิ่งจะทำให้เข้าใจใน ASP Script ได้อย่างไม่ยากนัก ... สำหรับ ASP Script ที่ใช้งานนี้ (RandomNumber) มันไม่ได้เปลี่ยนไปจากเดิมของ VB6 เลย ... แต่ที่สำคัญมากที่สุดเห็นจะเป็นเรื่องของ Algorithm ซ่ะมากกว่า เพราะมันก็ไม่ได้เปลี่ยนแปลงไปตามภาษา หรือ เครื่องมือที่ใช้งานเลยครับ ... พี่น้อง |