עבור לתוכן

בעיה בתוכנות של C

Featured Replies

פורסם

לא עובד לי ה RANDOM RANDOMIZE הקומפיילר מציג בעיות (TURBO C ו- VISUAL C++) זה בעיה בתוכנה ? אני לא יכול לכתוב רנדום ...

פורסם

<p><p><p><p><p><p><p><p><p><p><p><p><p>נסה את זה:</p><p></p><div></div><pre class="ipsCode">#include <stdlib.h><br>#include <stdio.h><br><br>int main(){<br>printf("%d", rand());<br><br>return 0;<br>}</pre><p></p></p></p></p></p></p></p></p></p></p></p></p></p>

פורסם
  • מחבר

<p><p><p><p><p><p><p><p><p><p><p><p><p>ואז ?</p><p>אם אני כותב:</p><p></p><div></div><pre class="ipsCode">randomize();<br>x=random(100)</pre><p></p><p>איקס זה כמובן משתנה ... והרנדום נותן לי מספרים מ0 -99</p><p>אז לא הבנתי מה כתבת ?</p></p></p></p></p></p></p></p></p></p></p></p></p>

פורסם

<p><p><p><p><p><p><p><p><p><p><p><p><p>אני לא כ"כ מכיר את הפונקציות שאתה עבדת איתן בכל אופן מה שאני כתבתי:</p><p>rand זוהי פונקציה שמחזיקה מספר שלם בין 0 ל-RAND_MAX.</p><p>RAND_MAX הוא קבוע שמוגדר שמשתנה ממחשב למחשב אך הוא עומד בערך על 32 אלף ומשהו.</p><p>כדי להגריל מספר בין 1 ל-99 תוכל להגרילו כך:</p><p></p><div></div><pre class="ipsCode">x=rand()%99+1;</pre><p></p><p>שים לב שבמידה ותריץ תוכנית זו מספר פעמים <strong>תמיד</strong> יצא לך אותו מספר, מאחר שישנו רצף מסודר של המספרים שיוגרלו.</p><p>אתה יכול לפתור זאת ע"י הפונקציה time שמחזירה את הזמן שעבר מ-1/1/1970 00:00:00 בשניות ולאתחל רצף ע"י הפונקציה srand.</p><p>לדוגמא: (בתוכנית הזו תקבל כל פעם מספר שונה בין 1 ל-99)</p><p></p><div></div><pre class="ipsCode">#include <stdio.h><br>#include <stdlib.h><br>#include <time.h><br><br>int main(){<br>srand(time(NULL));<br>printf("%d", rand()%99+1);<br><br>return 0;<br>}</pre><p></p></p></p></p></p></p></p></p></p></p></p></p></p>

פורסם

<p><p><p><p><p><p><p><p><p><p><p><p><p>נדמה לי שה random ו- randomize הן פונקציות שיש רק ב turbo c (אם אני לא טועה). עשית include ל stdlib.h ?</p></p></p></p></p></p></p></p></p></p></p></p></p>

פורסם

אתה צריך לעשות include לstdlib.h ולtime.h, אז להריץ את randomize מתישהו ואז מתי שבא לך להשתמש בפונקצייה random(100) שתחזיר מספר בין 0 ל99..

סתם אם אתה מתעניין, הפונקציות האלה פועלות על העיקרון של הGUID... Genuine Unique Identification או משהו כזה.. הרעיון הוא שלפי השעה במחשב (שהרי היא אף פעם לא אותו הדבר), המחשב ממיר אותה למספר כלשהו שנקרא GUID. הכללת בתחילת התוכנית את time.h כדי שrandomize תוכל "להיות מוכנה" לקבל את הGUID לפי הזמן ופשוט לעשות שארית (מודולו.. %) במספר שביקשת.

לכן, אם לדוגמא תרשום

random(100)

הפונקצייה תקבל את הGUID ותבצע את הפעולה:

GUID%100, ובכך תקבל מספר בין 0 (אם אין שארית) ל99 (השארית הכי גבוהה שיכולה להיות בחילוק ב100).

פורסם

GUID זה קיצור Globally Unique Identifier שהוא מספר רנדומלי שמשמש ב windows לזיהוי רכיבי תוכנה.

פורסם

בדיוק. תודה על התיקון.

פורסם

אתה צריך לעשות include לstdlib.h ולtime.h, אז להריץ את randomize מתישהו ואז מתי שבא לך להשתמש בפונקצייה random(100) שתחזיר מספר בין 0 ל99..

סתם אם אתה מתעניין, הפונקציות האלה פועלות על העיקרון של הGUID... Genuine Unique Identification או משהו כזה.. הרעיון הוא שלפי השעה במחשב (שהרי היא אף פעם לא אותו הדבר), המחשב ממיר אותה למספר כלשהו שנקרא GUID. הכללת בתחילת התוכנית את time.h כדי שrandomize תוכל "להיות מוכנה" לקבל את הGUID לפי הזמן ופשוט לעשות שארית (מודולו.. %) במספר שביקשת.

לכן, אם לדוגמא תרשום

random(100)

הפונקצייה תקבל את הGUID ותבצע את הפעולה:

GUID%100, ובכך תקבל מספר בין 0 (אם אין שארית) ל99 (השארית הכי גבוהה שיכולה להיות בחילוק ב100).

אני לא יודע מה המקור לבלבול שלך, אבל אין כאן שום קשר ל-GUID.

פונקצית ה-rand הנפוצה והסטדנרטית מגרילה מספר pseudo-random (כמו-אקראי) ע"י חישוב על מספר כלשהו הנקרא SEED, ואז מציבה את התוצאה חזרה למשתנה SEED ומחזירה את התוצאה.

על כן בהנתן SEED ראשוני קבוע, סדרת המספרים האקראית המוחזרת ע"י rand תהיה זהה.

על מנת למנוע זאת משתמשים ב-srand כדי לאתחל את SEED לערך חדש כל פעם. ואיזה ערך שונה תמיד כל פעם שמפעילים את התוכנית? הזמן כמובן!

אגב, הגרסה הנפוצה של מימוש rand נראית משהו כמו:

int rand()
{
seed = (seed * A) + B;
return seed / DIV;
}

כאשר A ו- B הם ערכים שנבחרו במיוחד כי הם יוצרים סדרת מספרים ארוכה ויותר "אקראית", ן-DIV הוא בדרך כלל 65536 על מחשבי 32bit.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים