› פורומים › אפיון ופיתוח פריוריטי › חילול מספר אקראי
- This topic has 3 תגובות, משתתף 1, and was last updated לפני 9 שנים, 11 חודשים by
יואב.
- Post
מוצגות 3 תגובות – 1 עד 3 (מתוך 3 סה״כ)
- Replies
-
- נובמבר 12, 2015 בשעה 12:11 pm
התכנית שמופיעה למטה תכין "מספרים אקראיים" (הם לא באמת אקראיים אבל מספיק טוב לצרכים שלנו). צריך להעביר שני פרמטרים –
NUM – כמה מספרים להכין
MAX – טווח המספרים (כמה שיותר גדול – יותר טוב). במקרה שלך, זה כנראה יהיה מספר הפריטים שהוגדרו.
אני מציג תכנית שעומדת בפני עצמה אבל אני משער שתצטרך להתאים את הגרעין לצרכים שלך./* Generate pseudo random numbers */
ERRMSG 1 WHERE :$.NUM < 1;
:HOUR = ATOI (STRIND (DTOA (SQL.DATE, 'hh:mm'), 1, 2));
:MINS = ATOI (STRIND (DTOA (SQL.DATE, 'hh:mm'), 4, 2));
:TMP = 0.0;
:XSEED = ((YEAR (SQL.DATE8) MOD 100) + (MONTH (SQL.DATE8) * 493))
MOD 30269;
:YSEED = ((MONTH (SQL.DATE8) – 1) + (2417 * :HOUR) + (23 * :MINS))
MOD 30307;
:N = 0; /* LOOP COUNTER */
LABEL 1;
:XSEED = 171 * (:XSEED MOD 177) – 2 * ROUND ((:XSEED + 0.0) / 177);
SELECT (:XSEED < 0 ? 30269 : 0) + :XSEED INTO :XSEED FROM DUMMY;
:YSEED = 172 * (:YSEED MOD 176) – 35 * ROUND ((:YSEED + 0.0) / 176);
SELECT (:YSEED < 0 ? 30307 : 0) + :YSEED INTO :YSEED FROM DUMMY;
:TMP = :XSEED / 30269.0 + :YSEED / 30307.0;
:PAR1 = ITOA (ROUND (:$.MAX * ABSR (:TMP – ROUND (:TMP))));
WRNMSG 2;
:N = :N + 1;
LOOP 1 WHERE :N < :$.NUM;
LABEL 9;כמובן, בעיות העיצוב באתר הזה הופכות חלק מהשרות להיות בעייתיות. למשל, השורה השלישית (חישוב מספר שעות) אמור להתחיל עם נקודותיים ולהסתיים עם שני סוגריים.
המספר האקראי מוצב לתוך המשתנה PAR1 ומוצג באמצעות הודעה – יכול להיות שתרצה לשנות זאת.
- נובמבר 12, 2015 בשעה 12:24 pm
במחשבה שניה, כל הקשור ל-XSEED די מיותר מפני שהערך ההתחלתי ישתנה רק פעם בחודש. יהיה יותר טוב לקבוע את ערכו ההתחלתי כך
523 * (XSEED = MONTH (SQL.DATE8) * 493 + DAY (SQL.DATE8ׁׁׁׁׁׂ ׁׁׁׂׂ ׁ
לא צריך את ה-MOD כי הערך המירבי 22129
לפחות כך תקבל ערכים שונים מדי יום.
גם הייתי מחליף את ה-MONTH באתחול YSEED ב-DAY, אם כי כאן זה פחות חשוב.
מוצגות 3 תגובות – 1 עד 3 (מתוך 3 סה״כ)
- יש להתחבר למערכת על מנת להגיב.