מספר רנדומי

lala82

New member
מספר רנדומי

אני עובדת על תוכנית ב-c++ ואני פשוט לא זוכרת איך אני יכולה לקבל מספר רנדומי ז"א מה הפקודה שבה אני אמורה להשתמש וכן מה הספריה שתאפשר זאת אשמח לקבל עזרה תודה מראש
 

maromnn

New member
>

#include <stdlib.h> #include <stdio.h> #include <time.h> void main(void) { int num; unsigned int first_num; long t; t=time(NULL); first_num=(unsigned) t; // המרת המספר ממספר ארוך למספר ללא סימן srand( first_num); // הצבת מספר אקראי התחלתי printf("random number from 0 to 99\n\n"); num = rand() % 100; printf("%d\n", num ); }​
 

lala82

New member
זה פשוט לא ב-C++

אני ממש לא מפחיתה בערך של הדברים שקיבלתי פשוט התוכנית שלי היא ב-C++ ןלא ב-C
 

vinney

Well-known member
אז תתרגמי ל++C.

מה, כבר לעסו לך, נשאר רק לבלוע...
 

lala82

New member
אם צריכה רק את שם הספריה

עם השאר כבר הסתדרתי אשמח לקבל תשובה
 

lala82

New member
לא!

את הספריה שמאפשרת את ביצוע הRANDOM בכל אופן עם זה הסתדרתי אבל משום מה הוא מעיף אותי מהתוכנית בכל פעם שאני נכנסת לפונקצי שבה אני מבצעת את הרנדום ואין לי מושג למה נ.ב: מצטערת על המגילה ותודה על הכוונה לעזור...
 

vinney

Well-known member
תצרפי את הקוד שלך

ותמיד תזכרי ש++C תמיד תומך אחורה בC
 

lala82

New member
תודה

קודם כל תודה שנית זקוד שלי הוא פונקציה מתוך תוכנית גדולה מקווה שתצליח להגיד לי למה אני עפה בפונקציה הזו:
void ran(char mat3[64][64], int len) { srand(len); int r,i,k,l,acc,m,j,acc1=0; char help[64][64] = {NULL}; int help1[64] = {0}; r=rand(); help[0][0]=r+48; help1[r] = 1; for (j=0; j<len; j++) { if (help1[j] == 0) acc1++; } while (acc1>0) { acc1=0; r=0; r=rand(); if (help1[r] == 0) { help1[r] = 1; for(l=0; l<len; l++) { acc=0; for(k=0;k<len; k++) { m=(help[l][k])-48; if (mat3[r][m] == NULL && mat3[m][r] == NULL) acc++; } if (acc == 0) { i=0; while (help[l] != NULL) i++; help[l] = r+48; } } } for (j=0; j<len; j++) { if (help1[j] == 0) acc1++; } } for (l=0; l<len; l++) { cout<<"help[" <<l<<"] = "; for (k=0; k<len; k++) cout<<help[l]; cout<<endl; } }

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

vinney

Well-known member
תצטרכי לעזור לי בזה

תגידי לי באיזה שלב ועל איזה קלט הפונקציה עפה. אבל הנה כמה הערות שאולי יעזרו לך תוך כדי שתדבגי (כי אני הולך לישון תיכף
) למה את עושה srand על len? ומה משמעות len? את מודעת למשמעות של srand? לא סתם השתמשו בtime בדוגמא שם למעלה, את יודעת... בלולאות שלך את רצה על len, אבל בשום מקום את לא בודקת שlen בגבולות המותר (יעני בין 0 ל64), איך את בטוחה שאת לא גולשת מעבר לזכרון שהקצית לעצמך? זה בכיף יכול להעיף אותך. כשאת עושה r=rand ואז עושה help1[r], זה מתכון לצרות. rand מגריל מספרים בתחום גדול מאוד, רוב הסיכויים שr יהיה גדול מ64. עוד מקום לגלישה מזכרון. כדי לוודא שהמספר שלך בתחום מסוים, תצטרכי ללמוד להשתמש במודולו (מכירה? זה אופרטור %). עוד משהו : mat3[r][m] == NULL - מה המשמעות של זה? הרי mat3 זה מטריצה של char, למה את משתמשת בNULL? למה לא 0? ויכול להיות שאת רגילה לפסקל ופתאום הכריחו אותך לעבור לC? כי זה נראה ככה... אני פה עוד כמה דקות, אז את מוזמנת לעוד הודעה אם את רוצה
 

lala82

New member
שוב פעם תודה

יש לי פרוייקט להגיש ביום חמישי וזה פשוט השלב האחרון שנשאר לי בתוכנית אז קודם כל אין לי יותר מדי (או בכלל אין לי) מושג לגבי srand פשוט חשבתי שהוא זה שיאפשר לי לבצע את הרנדום שנית אני עושה זאת על len כדי להגביל את התחום שלו (אבל לפי התגובה שלך זה לא נכון) ולכן חשבתי שאין לי בעיה של גלישה ולגבי הNULL במטריצה שי יש או NULL או char ולכן אני משתמשת בNULL
 

vinney

Well-known member
אז ככה

אני אזכיר לך (אני מקווה שלא אחדש לך...) איך rand עובד. מדובר במחולל פסאודה-אקראי (כי מחשב זה מכונה דטרמיניסטית הרי), ז"א שמדובר באלגוריתם שבהנתן קלט קבוע, יתן פלט קבוע. מה עושים כדי שפלט לא יהיה קבוע, ואפילו יראה אקראי? נכון, נותנים קלט משתנה כל פעם. בגלל זה מאתחילם את srand (שזה הפונקציה שמקבלת את הקלט המדובר) עם הערך המוחזר מtime (עם NULL כפרמטר), שזה זמן מחשב נוכחי. הוא תמיד שונה, כמו שאת יכולה לתאר לעצמך (לא מאתחלים srand כל פעם, אלא פעם אחת בתוכנית, זה עוד שימוש לא נכון שעשית). כדי לגביל את הערך המוגרל, צריך לקחת את הערך המוגרל המוחזר מrand, ולעשות עליו modulo עם המספר בו את רוצה להגביל, כך תקבלי שארית חלוקה של תוצר הrand במספר המגביל שנתת, ז"א המספר יוגרל בעצם בין 0 ל1-מספר המגביל, שזה מה שאת צריכה (בהנחה שאת עושה modulo 64). לגבי NULL - זהו ערך long, בשביל char תשתמשי ב0, זה יותר נכון ויותר קריא, אבל זאת דעתי האישית, ++C עושה casting לקבועים במצבים כאלה. לילה טוב ו
 

lala82

New member
במיוחד בשבילך

ואני חייבת להגיד לך בפעם המיליון : ת-ו-ד-ה-! על כל דקה שהקדשת לבעיה שלי ואולי בזכותך אני אסיים את הפרוייקט שלי בזמן ולא אגרור אותו לתקופת המבחנים וסליחה שגזלתי מזמנך ושיהיה לך לילה מקסים(כשתלך לישון כמובן) עם המווווון חלומות מתוקים
 

vinney

Well-known member
../images/Emo13.gif

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

lala82

New member
בהצלחה

אז כמובן שיהיה גם לך המוווון הצלחה אתה נחמד זה מגיע לך.....
 
למעלה