מספרים אקראיים – חלק ב'

‏ • 23 באפריל, 2002



<% Function GetRandomNumber(MinVal,MaxVal) GetRandomNumber= Int(((MaxVal-MinVal+1) * Rnd) + MinVal) End Function Sub RandomArray(arr, MinVal, MaxVal) Dim i,j For i= LBound(arr) To UBound(arr) arr(i) = GetRandomNumber(MinVal,MaxVal) For j=0 To i-1 If arr(i) = arr(j) Then i = i -1 Exit For End If Next Next End Sub Function GetPassword(length) Dim password, i, num For i=1 To length num = GetRandomNumber(0,1) If num=0 Then password = password & Chr(GetRandomNumber(97,122)) Else password = password & Chr(GetRandomNumber(48,57)) End If Next GetPassword = password End Function %>


ב
חלק הראשון

של המאמר למדנו על השימוש בפונקציה Rnd של VBScript, והפקת מספרים אקראיים בטווח מסויים, ובנינו את הפונקציה


GetRandomNumber(MinVal,MaxVal)

המחזירה לנו מספר אקראי בטווח שבין MinVal ל-MaxVal. בחלק זה של המאמר נעשה שימוש בפונקציה זו.

הפקת סדרה של מספרים אקראיים אשר אינם חוזרים על עצמם

אם נרצה להפיק סדרה של מספרים אקראיים אשר אינם חוזרים על עצמם, נצטרך לשמור כל מספר שכבר הפקנו, ולהשוות כל מספר חדש שאנו מפיקים, כדי לוודא שמספר זה אינו קיים כבר. המקום הטבעי לאכסון סדרת המספרים יהיה מערך.

אנו נבנה פרוצדורה המקבלת מערך, טווח עליון וטווח תחתון להפקת המספרים:


Sub RandomArray(arr, MinVal, MaxVal)

MinVal ו-MaxVal ישמשו אותנו לקריאה לפונקציה GetRandomNumber, כדי לקבל את המספרים בטווח הרצוי.

בתוך הפרוצדורה נבנה לולאה, אשר בודקת על כל מספר חדש שמופק, האם הוא קיים כבר, ואם כן, נפיק אותו שוב:



1
2
3
4
5
6
7
8
9
10
11  

<%
For i= LBound(arr) To UBound(arr)
    arr(i) = GetRandomNumber(MinVal,MaxVal)
    For j=0 To i-1
        If arr(i) = arr(j) Then
            i = i –1
            Exit For
        End If
    Next
Next
%>


בלולאה החיצונית, אנו מכניסים את הערכים האקראיים לתוך המערך. בלולאה הפנימית אנו משווים כל ערך חדש לכל הערכים שקדמו לו, ואם הוא שווה לאחד מהם, אנו יוצאים מהלולאה, לא לפני שאנו מורידים ב-1 את המונה של הלולאה החיצונית, כדי שהתא במערך יקבל ערך אקראי מחדש.

וזו הפרוצדורה במלואה:



1
2
3
4
5
6
7
8
9
10
11
12
13
14  

<%
Sub RandomArray(arr, MinVal, MaxVal)
    Dim i,j
    For i= LBound(arr) To UBound(arr)
        arr(i) = GetRandomNumber(MinVal,MaxVal)
        For j=0 To i-1
            If arr(i) = arr(j) Then
                i = i –1
                Exit For
            End If
        Next
    Next
End Sub
%>


הקריאה לפרוצדורה תיעשה כך:



1
2
3
4
5  

<%
Randomize
Dim arr(6)
Call RandomArray(arr,1,10)
%>


בסיום הפרוצדורה, המערך arr יחזיק לנו שישה מספרים אקראיים שונים אחד מן השני. הדספת המערך תיעשה כך:



1
2
3
4
5  

<%
For i = LBound(arr) To Ubound(arr)
Response.Write arr(i) & "<BR>"
Next
%>


והתוצאה:

<% Randomize Dim arr(6) Call RandomArray(arr,1,10) For i = LBound(arr) To Ubound(arr) Response.Write arr(i) & "
"
Next
%>

(אם נרענן את העמוד, נראה כיצד התוצאה משתנה)


הפקת סיסמא אקראית

לעיתים אנו רוצים להפיק עבור המשתמש שלנו סיסמא אקראית אשר תשמש אותו בכניסה לחלקים מסויימים באתר. את הסיסמא הזו אנו יכולים לשלוח אליו בדואר, להציג על המסך או להעביר אליו בכל דרך אחרת.

לרוב, אנו רוצים שהסיסמא תהיה מורכבת מאותיות ומספרים בלבד, ללא תווים מיוחדים.

למטרה זו נבנה פונקציה, המקבלת מספר ומחזירה מחרוזת אשר אורכה כאורך המספר שקיבלה, ומורכבת מאותיות ומספרים אקראיים.

Function GetPassword(length)

נבנה לולאה הרצה מ-1 ועד האורך הנתון


For i=1 To length

בשורה הראשונה, נחליט, גם כן באופו אקראי, האם התו הבא יהיה אותו או מספר. זאת נעשה ע"י הקריאה לפונקציה GetRandomNumber, בבקשה שתחזיר לנו מספר שהוא או 0, או 1

num = GetRandomNumber(0,1)

נחליט, שאם num הוא 0, התו הבא יהיה מספר, ואם הוא 1, התו יהיה אות.

נבנה תנאי הבודק את num, ובתוך כל אחד מחלקי התנאי, נקרא שוב לפונקציה GetRandomNumber, הפעם עם טווח המציין את ערך ה-ASCII של אותיות ומספרים.

את המספר שקיבלנו, נהפוך לתו באמצאות הפונקציה Chr, המקבלת ערך ASCII ומחזירה את התו אותו הוא מייצג.
את התו החדש, נשרשר למחרוזת password, אשר תכיל את הסיסמא הסופית.


1
2
3
4
5
6
7  

<%
If num=0 Then
    password = password & Chr(GetRandomNumber(97,122))
Else
    password = password & Chr(GetRandomNumber(48,57))
End If
%>


הפונקציה במלואה:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15  

<%
Function GetPassword(length)
   Dim password, i, num

   For i=1 To length
      num = GetRandomNumber(0,1)
      If num=0 Then
         password = password & Chr(GetRandomNumber(97,122))
      Else
         password = password & Chr(GetRandomNumber(48,57))
      End If
   Next
   GetPassword = password
End Function
%>


הקריאה לפונקציה תיעשה כך:


1
2
3
4
5  

<%
Randomize
Response.Write (GetPassword(8)) & "<BR>"
Response.Write (GetPassword(6)) & "<BR>"
%>


והתוצאה:

<% Randomize Response.Write (GetPassword(8)) & "
"
Response.Write (GetPassword(6)) & "
"
%>

(אם נרענן את העמוד, נראה כיצד התוצאה משתנה)

הערה:
כמובן, שאם אנו רוצים לשמור את הסיסמא בבסיס הנתונים, ואנו לא רוצים שיהיו כפילויות, אנו צריכים לבדוק האם הסיסמא שהפקנו אינה קיימת כבר, ואם כן, לקרוא שוב לפונקציה.


בהצלחה!

תגיות: , , ,

תגובות בפייסבוק