• 0
ahmed.o.mohamed

هل يمكنك إيجاد جميع الإحتمالات !؟

سؤال

السلام عليكم

يبدو أن القسم نائم هذه الأيام, لذا بحثتُ البارحة في بقية الأقسام لعلي أجد سؤالا أو فكرة تستحق النقاش لأضعها هنا و بالتالي يستيقظ الأعضاء من هذا السبات العميق :D

فكرة السؤال الذي عثرتُ عليه جميلة جدا و هي إيجاد جميع الإحتمالات (و ليس عدد الإحتمالات) للأحرف و الأرقام الموجودة بين 000000000000 وحتى FFFFFFFFFFFF (الأحرف و الأرقام المُستخدمة هي تلك المُكونة لقاعدة الــ Hex).

لمعرفة التفاصيل : موضوع السؤال الأصلي.

تجدون في المشاركة الأخيرة مقدمة بسيطة للفكرة (إظهار جميع الإحتمالات الممكنة لــ ABCDEF, يوجد 46656 احتمال), و هذا الكود :

#include <stdio.h>#include <math.h>#include <stdlib.h>int main() {    int i, j, n = 6, p = 6;    char *Vect;    char **Liste;    FILE * File;    Vect = (char *) malloc(n * sizeof (char));    Vect = "ABCDEF";    Liste = (char **) malloc((int) pow((double) n, (double) p) * sizeof (char *));    for (i = 0; i < (int) pow((double) n, (double) p); i++) {        Liste[i] = (char *) malloc(p * sizeof (char));    }    File = fopen("RandomFile.txt", "w");    for (i = 0; i < (int) pow((double) n, (double) p); i++) {        for (j = 0; j < p; j++) {            Liste[i][j] = Vect[(i / (int) pow((double) n, (double) (p - (j + 1)))) % n];            fprintf(File, "%c", Liste[i][j]);        }        fprintf(File, "%s", "\n");    }    free(Vect);    for (i = 0; i < (int) pow(n, p); i++) {        free(Liste[i]);    }    free(Liste);    return 0;}

سأضع حل السؤال بعد الإنتهاء من نقاش الفكرة إن شاء الله.

بانتظار إبداعاتكم.

تم تعديل بواسطه مصطفى 36a2
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

70 إجابة على هذا السؤال .

  • 0

هل يمكن المشاركة من أقسام آخرى ؟؟

تقبل تحياتي :happy:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مرحبا أخي bahbah :)

بالطيع, المشاركة مفتوحة للكل, لكن إن لم تستطع كتابة الكود بالسي أو بالسي++ فيمكنك كتابته على طريقة الــ Pseudo-code و حاول أن يكون قياسيا قدر الإمكان (لا تستخدم نوع بيانات خاص بلغة برمجة معينة).

بالتوفيق.

تم تعديل بواسطه أحمد الشنقيطي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

سأستخدم VB.NET ..

وإن شاء الله قدر الإمكان سيكون الكود قياسياً ...

ووصلت إلى هذه النتيجة وفيها خطأ ..

post-219398-032168800 1344876188_thumb.p

وعند الضغط مرة آخرى يصبح هكذا

post-219398-030360700 1344876213_thumb.p

طورت الفكرة ووصلت إلى هذه المرحلة

post-219398-006778400 1344876259_thumb.p

ولكن ما تزال المشكلة الثانية قيد الحل والتفكير فيها ..

تحياتي :happy:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

محاولات لا بأس بها, لكن إياك أن تستخدم إحدى دوال الــ VB.NET و تقول لي أنها معرفة مسبقا :D (أمزح فقط :happy: )

تم تعديل بواسطه أحمد الشنقيطي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

وجدت طريقة ولكن سأستعمل Function وسيكون الكود طويل للغاية وليس بسيط مثل هذا ..

لقد إعتمدت في مثالي هذا على إستيراد مكتبة Text فهل ينفع هذا !! ..

Imports System.Text

....

والآن أحاول البحث عن حل للمشكلة التي أواجهها ..

تحياتي :happy:

إن شاء الله أستخدم المعرفة السابقة :lol:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا لك اخي احمد انت إنسان اصيل ربنا يبارك فيك اخي علي المساعدة

والف شكر لك أخي bahbah علي المساعدة

اولا اخواني الكرام البرنامج الذي صنعة لي صديقي صنعة ببرنامج الفيجوال بيسك

وكانت واجهة البرنامج شاشة دوس وصنعة خلال 5 دقائق لرؤية البرنامج في المرفقات

شكرا لكم جميعا عالي المساعدة

Random.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ربنا يوفقق أخي bahbah

يا الله .. ويوفقك معي ..

آخر التطورات ، إستعملت Function من صنعي ..

وهو يعتني بالخصائص القياسية وليس مختص باللغة كما أعتقد (معرفة سابقة :lol:)

post-219398-023678600 1344879888_thumb.p

تحياتي :happy:

وما تزال المشكلة الثانية قائمة في المثال الأول ،، في طريقي للحصول على حل ..

هذا هو البرنامج للتجربة ..

تحياتي :happy: ..

Ihtmal.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لقد إعتمدت في مثالي هذا على إستيراد مكتبة Text فهل ينفع هذا !! ..

لا ينفع, ممنوع استيراد أسلحة برمجية من الخارج :D

طورت الفكرة ووصلت إلى هذه المرحلة

post-219398-006778400%201344876259.png

جيد, لكن المطلوب هو إظهار الإحتمالات المُكونة من 12 خانة فقط !!

آخر التطورات ، إستعملت Function من صنعي ..

فكرة الــ Function جيدة مع أنها ثانوية بعض الشيئ لأن المطلوب هو إظهار جميع الإحتمالات دفعة واحدة.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
جيد, لكن المطلوب هو إظهار الإحتمالات المُكونة من 12 خانة فقط !!

هذه المشكلة التي أواجهها !!!

لا ينفع, ممنوع استيراد أسلحة برمجية من الخارج

أنا إستوردت رصاصة فقط !! .. :lol:

وهذا سيلغي المثال الأول ويجب علي العمل على المثال الثاني وهذا ينهي جميع مشاكلي ..

فكرة الــ Function جيدة مع أنها ثانوية بعض الشيئ لأن المطلوب هو إظهار جميع الإحتمالات دفعة واحدة.

سأعدل عليها لكي تكون دفعة واحدة فقط ..

تحياتي :happy:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أخي أحمد ممكن أرى نتائج كودك ؟؟

تعبت في التعديل على كودي ..

وعندما أرى كودك وأحاول الفهم ، أتعقد صراحة :wacko: !!

تحياتي :happy:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أنا إستوردت رصاصة فقط !! .. :lol:

لكنها رصاصة من العيار الثقيل :P

وهذا سيلغي المثال الأول ويجب علي العمل على المثال الثاني وهذا ينهي جميع مشاكلي ..

لا بأس, استخدم هذا الحل و أرنا إياه ريثما تصل إلى الحل المطلوب :)

أخي أحمد ممكن أرى نتائج كودك ؟؟

تفضل : حمل الملف التنفيذي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أفكر في الإعتزال .. :sleep:

واجهتني مشكلة ..

وهي عندما أقوم بعمل جملة For ..

للعدد معين من الإحتمالات تظهر عدة نتائج مكررة وهكذا ولم أصل إلى الآن للنتيجة تذكر ..

وها أنا أحاول ، وأتمنى إيجاد حل للمشكلتي ..

تحياتي :happy:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أحم .. أحم, أعتقد أنه يجب أن نفكر في طريقة جديدة لمعالجة هذه المشكلة, لأن الطرق لكلاسيكية لا تنفع !

فكرتُ في تقسيم مهام الكود إلى جزئين, باستخدام أكثر من (Computing Element (CE عن طريق البرمجة المتوازية (parallel programming) حيث نُقسم process البرنامج الرئيسيى إلى two processes, الأول يتولى حساب الإحتمالات الممكنة لــ ABCDEF و الثاني يتولى حساب الإحتمالات الممكنة لــ 0123456789 و في الأخير نخلط الإحتمالات السابقة لنحصل على الإحتمالات الكلية ..

لكن ما لبثتُ أفكر في الأمر حتى عرفتُ أنه من المستحيل إنجازه بهذه الطريقة !! ..

قد تسأل مالسبب ؟؟

أقول لك : السبب في غاية البساطة ..

.. هل تعرف كم يوجد من احتمال بين 000000000000 و FFFFFFFFFFFF ؟؟

يوجد

mimetex.cgi?16^{16}
احتمال, أي ما يُعادل:

18446744073709551616

و بالتالي ظهرت مشكلة جديدة في حل السؤال بالسي++ و هي : التعامل مع الــ BigInteger !!

أيضا, هناك سؤال آخر مهم : ما هو نوع البيانات المناسب لتخزين مثل هذا الكم الهائل من البيانات ؟؟

لا تحزنوا .. يبدوا أن السؤال يحتاج إلى تحريك الجمجمة :D

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بالرجوع إلى دورتي السابقة وجدت هذا التوضيح للمتغيرات ..

%25D8%25A7%25D9%2584%25D9%2585%25D8%25AA%25D8%25BA%25D9%258A%25D8%25B1%25D8%25A7%25D8%25AA.png

فأعتقد أنه إما Long أو Decimal ..

تحياتي :happy:

لماذا لم يشارك أي أحد في الموضوع من القسم ؟؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

والله انا ما عارف اقول لكم اية اخواني

الف شكرا لكم علي المساعدة وإن شاء الله توصلو لحل

ربنا يوفقكم يارب ويبارك فيكم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

والله انا ما عارف اقول لكم اية اخواني

الف شكرا لكم علي المساعدة وإن شاء الله توصلو لحل

ربنا يوفقكم يارب ويبارك فيكم

الله يسمع منك وإن شاء الله نوصل للحل بأسرع وقت ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أعتقد أنه إما Long أو Decimal ..

في C++, القيمة العُظمى للنوع unsigned long long int حسب المعيار C99 هي :

MAXVALUE(unsigned long long int) = 2^64 - 1 = 18 446 744 073 709 551 615 //64 bits
MAXVALUE(unsigned long long int) = 2^32 - 1 = 4 294 967 295 //32 bits

لكن إن أردنا التعامل مع الــ BigInteger في السي/السي++ فيجب أن نستخدم إحدى المكتبتين :

GMP (GNU Multiple Precision Arithmetic Library)

MIRACL (Multiprecision Integer and Rational Arithmetic C/C++ Library)

بالنسبة لصعوبة السؤال فهي تكمن في نقطتين أساسيتين هما :

  • أولا : يجب علينا حجز مصفوفة بطول 18446744073709551616, حتى نستطيع تخزين كل احتمال في خانة منفردة.
  • ثانيا : استخدام for تبدأ من صفر و تنتهي عند 18446744073709551616, للمرور على جميع الإحتمالات.

لماذا لم يشارك أي أحد في الموضوع من القسم ؟؟

هكذا هم مشرفونا الجدد, يكتفون بالتفرج كما هي العادة ..

لكن لا تقلق, فهم يُتابعونا أولا بأول !! :blush:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

في C++, القيمة العُظمى للنوع unsigned long long int حسب المعيار C99 هي :

MAXVALUE(unsigned long long int) = 2^64 - 1 = 18 446 744 073 709 551 615 //64 bits
MAXVALUE(unsigned long long int) = 2^32 - 1 = 4 294 967 295 //32 bits

لكن إن أردنا التعامل مع الــ BigInteger في السي/السي++ فيجب أن نستخدم إحدى المكتبتين :

GMP (GNU Multiple Precision Arithmetic Library)

MIRACL (Multiprecision Integer and Rational Arithmetic C/C++ Library)

لا أعرف شئ عن الـC++

    • أولا : يجب علينا حجز مصفوفة بطول 18446744073709551616, حتى نستطيع تخزين كل احتمال في خانة منفردة.
    • ثانيا : استخدام for تبدأ من صفر و تنتهي عند 18446744073709551616, للمرور على جميع الإحتمالات.

أولاً أنا معك ، ثانياً ، قد لا أكون معك ..

فمشكلتي هي في for قد يكون الدوت نيت بطئ لدي بحيث أن يكرر الناتج عدة مرات ..

هكذا هم مشرفونا الجدد, يكتفون بالتفرج كما هي العادة ..

لكن لا تقلق, فهم يُتابعونا أولا بأول !! :blush:

هذه هي المشكلة ..

متابع بدون كلام ، لا فائدة منه !! ..

تحياتي :happy:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لا زال التفكير جار في حل السؤال :)

حتى الساعة, حصلتُ على 167 772 16 احتمال ..

أي ما يُعادل ستة عشر مليون وسبعمائة وسبعة وسبعون الفا ومئتان وستة عشر !! :wacko:

مع العلم أن طول السلسلة لم يتجاوز 8 :blink:

المشكلة الجديدة هي أن حجم الملف النصي أصبح يساوي 160Mb, انظروا :

post-219439-005426600 1344905703_thumb.p

كنتَ أتمنى أن أرفع لكم الملف لتُشاهدوه .. :happy:

تم تعديل بواسطه أحمد الشنقيطي
تصحيح كتابة العدد.
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أعتقد أن الإحتمالات يجب أن لا تحتوي على رقم أو حرف مُكرر حتى يقل عددها و يُصبح منطقيا !

تُوفر مكتبة STL في C++ الدالة next_permutation, و هذا وصفها من MSDN :

L'algorithme d' next_permutation modifie l'ordre des éléments dans la plage [First, Last) à la permutation lexicographique suivante et retourne true. S'il n'y a aucun next_permutation, il positionne la séquence pour être la première permutation et retourne false.

انظر المثال:

#include <iostream>
#include <algorithm>
using namespace std;

void print(char *v, const int size)
{
if (v != 0) {
for (int i = 0; i < size; i++) {
cout<<v[i];
}
cout<<endl;
}
}

void permutation(char T[], int size )
{
std::sort( T, T + size );
do
{
print( T, size );
}
while( std::next_permutation( T, T + size ) );
}
int main(){
char array[]= "ABCD";
permutation(array,4);
return 0;
}

مُخرجات الكود:

post-219439-009731800 1344908545_thumb.p

أعرف أنه يُمنع الإستعانة بمكتبات خارجية و لكنني وضعتُ المثال للإستفادة فقط :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

فمشكلتي هي في for قد يكون الدوت نيت بطئ لدي بحيث أن يكرر الناتج عدة مرات ..

نفس الخطأ وقع فيه الأخ الذي كتب البرنامج لــ hassan9599 !!

جرب البرنامج لترى النتائج :happy:

مالمشكلة التي يُواجهها مبرمجوا الــ VB مع for ؟ :blink:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لا زال التفكير جار في حل السؤال :)

حتى الساعة, حصلتُ على 167 772 16 احتمال ..

أي ما يُعادل مليار و ستة ملايين و سبعمائة و سبعون ألفا و مئتان و ستة عشر !! :wacko:

مع العلم أن طول السلسلة لم يتجاوز 8 :blink:

المشكلة الجديدة هي أن حجم الملف النصي أصبح يساوي 160Mb, انظروا :

post-219439-005426600 1344905703_thumb.p

كنتَ أتمنى أن أرفع لكم الملف لتُشاهدوه .. :happy:

عمل رائع بالتوفيق ..

نفس الخطأ وقع فيه الأخ الذي كتب البرنامج لــ hassan9599 !!

جرب البرنامج لترى النتائج

مالمشكلة التي يُواجهها مبرمجوا الــ VB مع for ؟

المشكلة هي أن لغة الـvb.net أصبحت بطئة بحيث أنها تترجم إلى اللغة الوسيطة ثم إلى لغة الآلة ..

وفي طول هذه الفترة وخصوصاً عمل الـRandom أي العشوائية يحتاج إلى وقت فتتكرر النتائج ..

تحياتي :happy:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

هل يمكن إستعمال التايمر فهو الحل ..

وملاحظة أعلى متغير هو Decimal ..

ولكن فقط إلى 1844674407370955161 وليس إلى 18446744073709551616

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

هكذا كان حلي لسؤالك الشنقيطيhappy.gif

#include <stdio.h>
#include <stdlib.h>

int main()
{
int i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,Num[16]={0};
char a[16][2], b[1][17];
FILE *ptr=NULL;
ptr=fopen ("on.txt","w");
if(ptr==NULL) exit(0);

for(i=0;i<16;i++)
for(j=0;j<16;j++)
{
for(k=0;k<16;k++)
{
for(l=0;l<16;l++)
{
for(m=0;m<16;m++)
{
for(n=0;n<16;n++)
{
for(o=0;o<16;o++)
{
for(p=0;p<16;p++)
{
for(q=0;q<16;q++)
{
for(r=0;r<16;r++)
{
for(s=0;s<16;s++)
{
for(t=0;t<16;t++)
{
for(u=0;u<16;u++)
{
for(v=0;v<16;v++)
{
for(w=0;w<16;w++)
{
for(x=0;x<16;x++)
{
for(y=0;y<16;y++)itoa(Num[y],a[y],16);
sprintf(b[0],"%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c"\
,a[0][0],a[1][0],a[2][0],a[3][0],a[4][0],a[5][0]\
,a[6][0],a[7][0],a[8][0],a[9][0],a[10][0],a[11][0]\
,a[12][0],a[13][0],a[14][0],a[15][0]);
puts(b[0]); //fprintf(ptr,"%s\n",b[0]);
Num[15]++; if(Num[15]==16) Num[15]=0;
}
Num[14]++; if(Num[14]==16) Num[14]=0;
}
Num[13]++; if(Num[13]==16) Num[13]=0;
}
Num[12]++; if(Num[12]==16) Num[12]=0;
}
Num[11]++; if(Num[11]==16) Num[11]=0;
}
Num[10]++; if(Num[10]==16) Num[10]=0;
}
Num[9]++; if(Num[9]==16) Num[9]=0;
}
Num[8]++; if(Num[8]==16) Num[8]=0;
}
Num[7]++; if(Num[7]==16) Num[7]=0;
}
Num[6]++; if(Num[6]==16) Num[6]=0;
}
Num[5]++; if(Num[5]==16) Num[5]=0;
}
Num[4]++; if(Num[4]==16) Num[4]=0;
}
Num[3]++; if(Num[3]==16) Num[3]=0;
}
Num[2]++; if(Num[2]==16) Num[2]=0;
}
Num[1]++; if(Num[1]==16) Num[1]=0;
}

fclose(ptr);
return 0;
}

يشتغل معي الكود بشكل جيد ولكن لا أعرف إذا كان بالمستوى المطلوب

ولحد الآن لازال البرنامج يبحث عن الإحتمالات و بعد مرور ربع ساعة من تشغيل البرنامجblink.gif

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .