الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تعرف على كيفية توليد ارقام عشوائية فى الجافا generate random number

بدأه رااحيل في 11 يونيو 2010 · 21 رد · 18,860 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

بداية قبل ما تقرأو الموضوع ادعولى لانى عندى امتحان

فى المادة دى

و انا بحب اذاكر و اذاكر للحواليه :wub:

ندخل فى الجد::::::

ماذا لو كنت محتاج فى برنامج ارقام يجب ان تكون متغيرة عن كل مرة ينفذ فيها البرنامج

و ان هذة الارقام يجب ان تكون غير متسلسة و لا تصاعديا و لا تنازليا او حتى نسبيا

الجافا توفر لك طريقتين لانتاج ارقام عشوائية

هيا نتعرف على الطريقة الاولى و هى:::::::

دالة static نحصل عليها عن طريق الفئة class الذى يدعى Math

طبعا كلنا نعرف ان اى دالة static ننادية عن طريق اسم ال class فقط اى

لا نحتاج الى ان نأخذ كائن او object من هذا الclass

و تستخدم هكذا

 double random=Math.random();

و لاحظ ان هذة الطريقة تنتج لنا ارقام كسرية double و تكون من 0الى 1 و تشمل الصفر و لا تشمل الواحد

لاحظ انه بعد مناداة هذة الدالة تنتج لك الرقم فأنت تحتاج فقط الى متغير لتضع فيه هذا الرقم و تستخدمه مثلما تريد

طيب اممممممم

ماذا لو نريد توليد ارقام اكبر من هذا المدىrange

يبقى الحل هو استخدام الطريقة التى سنلقى عليها نظرة الان:::::

هى استخدام الفئة Random

نقوم بأخذ كائن من هذة الفئة و من ثم نستطيع استخدام بعض الدوال المختلفة التى تتيح لنا اختيارات عدة

 Random r = new Random();

و ها هى بعض الدوال مع شرح وظيفتها

int integerNum =  r.nextInt( n);//حيث n هو المدى الذى تقوم الدالة  بتوليد ارقام عشوائة من الصفر حتى هذا الرقم

int doubleNum =  r.nextDouble( n);//حيث n هو المدى الذى تقوم الدالة  بتوليد ارقام عشوائة من الصفر حتى هذا الرقم

 int intNumber =  r.nextInt();//هنا ان لم تحدد الرقم ستقوم الدالة بتوليد ارقام فى المجال الكامل الذى يغطيه النوع int

 boolean boolFlage =  r.nextBoolean()  تقوم هذة الدالة بارجاع true or false بطريقة عشوائية

هيا نرى مثال على ذلك:::::

 import java.util.Random;


public class RandomInteger {

  public static  void main(String[] args){

    Random randomGenerator = new Random();
    for (int i = 1; i <= 10; i++){
      int randomInt = randomGenerator.nextInt(100);
      System.out.println(randomInt);
    }

   }

 }

فى هذا المثال كل مرة ينفذ فيها البرنامج سيخرج لك ارقام مختلفة

و لاحظ ان ال range الذى تحدده الدالة تقوم بتوليد من الصفر حتى هذا المجال الذى حددته انت مطروح منه واحد

فقط :wub:

تم تعديل هذه المشاركة بواسطة اسراء شلبى في 11 يونيو 2010 في 20:16

2
00020309t.gif

1958_1963.gif
#2

درس مميز كالعاده..... يضاف إلي قائمة دروسك المميزه

#3

السلام عليكم

لست مبرمج جافا ولكن من باب الفضول ...:

أتمنى أن أعرف ما هي الخوارزمية المعتمدة في توليد الارقام العشوائية ...في بيئة الجافا؟ بمعنى هل هي مطابقة لخوارزمية الوقت كما في مايكروسوفت أم لا؟

تم تعديل هذه المشاركة بواسطة Devd في 12 يونيو 2010 في 01:27

#4

السلام عليكم ..

اقتباس
أتمنى أن أعرف ما هي الخوارزمية المعتمدة في توليد الارقام العشوائية ...في بيئة الجافا؟ بمعنى هل هي مطابقة لخوارزمية الوقت كما في مايكروسوفت أم لا؟

ماهي خوارزمية الوقت؟

#5
Khaled.Alshaya كتب:

السلام عليكم ..

ماهي خوارزمية الوقت؟

ما هي الألية التي تتم فيها تهيئة الـــ SEED للتابع Random ؟

#7

تم إضافة الموضوع إلى المواضيع المميزة

تحت بند سلسلة الأستاذة إسراء للمبتدئين

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#8
Devd كتب:

ما هي الألية التي تتم فيها تهيئة الـــ SEED للتابع Random ؟

Random class في جافا يستخدم Linear Congruential Formula

mimetex.cgi?X_{i}+1 = (A*X_{i}+C)\bmod{M

والتي ليست بـ Truly Random Number Generator لأن الـ Seed بعد فترة سيتكرر وبالتالي تكرار كل ما يليه من أرقام مولدة سابقاً.

بشكل عام تعتبر الصيغة جيدة لأنها تطيل من فترة عمر الأرقام حتى تتكرر القيمة الابتدائية للـ Seed.

تم تعديل هذه المشاركة بواسطة Xacker في 18 يونيو 2010 في 21:50

3

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#9

حسب ما فهمت من كلامك أخي Xacker أن هناك أفضل منها

هلا كلمتنا أكثر عن الموضوع

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#10

صراحة انا لم ادرس الخوارزميات

بس تسجيل متايعة ان شاء الله

00020309t.gif

1958_1963.gif
#11
علاء الصالحي كتب:

حسب ما فهمت من كلامك أخي Xacker أن هناك أفضل منها

هلا كلمتنا أكثر عن الموضوع

تحياتي

صيغة Linear Congruential تعتبر من أفضل الصيغ وأكثرها شيوعاً لتوليد pseudo numbers

والمولد يسمى PRNG = Pseudo Random Number Generator

الفائدة هنا أنه يمكن تطبيقها بأقل كلفة ممكنة، بالأجهزة الحالية التي بين أيدينا، كما أنها قادرة على توليد مجال كبير من الأرقام العشوائية كافية بشكل لإجراء عدد كاف من الاختبارات (نظرياً) لكنها في لحظة ما ستصل إلى توليد الـ Seed الابتدائي وبما أنها تعتمد على صيغة محددة برمجياً (كأن تقول Seed + 1000 * Seed mod 50) فهنا سيتم إعادة تكرار ذات البيانات التي حصلت عليها سابقاً مجدداً وهكذا..

أما لو كنت تبحث عن true randomness فالسؤال هنا، متى يمكن أن نصف شئ بأنه Totally Random ؟ هل وصفه بأنه non-deterministic و non-periodic كافي ؟

مولدات TRNG تعتمد في قيمها الابتدائية على البيانات الملتقطة من الظواهر الطبيعية، كالموجات الناتجة عن ظاهرة البرق وموجات الطاقة والضجيج الأبيض الخ ومثل هذه الظواهر تكون العشوائية فيها كبيرة جداً (هل يمكن القول أنها totally random ؟ هذا سؤال لا أستطيع الإجابة عليه لأنه خارج معلوماتي)

لكن بالطبع مثل هذه المولدات تحتاج إلى أجهزة Hardware تستطيع التقاط الطاقة، تحولها إلى صيغة أخرى (كهربائية مثلاً) وفي هذه الحالة يلزم transducer، ومن ثم تحتاج إلى شئ يحول الحالة الكهربائية المجردة إلى شئ تستطيع قياسه، وأخيراً تحويل هذه القياسات إلى تمثيل رقمي, 0 و 1 مثلاً.

كخلاصة، نحن نتكلم عن كلفة عالية + مرونة قليلة لكن من ناحية أخرى non-deterministic و non-periodic.

إن كنت تبحث عن توليد (أو استخدام أرقام عشوائية حقيقية في مشروع ما) فيمكنك الاستفادة من الخدمة المقدمة من موقع Random.org

RANDOM.ORG offers true random numbers to anyone on the Internet. The randomness comes from atmospheric noise, which for many purposes is better than the pseudo-random number algorithms typically used in computer programs. People use RANDOM.ORG for holding drawings, lotteries and sweepstakes, to drive games and gambling sites, for scientific applications and for art and music. The service has existed since 1998 and was built and is being operated by Mads Haahr of the School of Computer Science and Statistics at Trinity College, Dublin in Ireland.

إن كان تطبيقك يمكنه استخدام الانترنت، فيمكن من خلال الرابط (مع ملاحظة البارامترات باللون الأحمر) الحصول على رقم عشوائي حقيقي

http://www.random.org/integers/?num=1&min=50000&max=500000&col=1&base=10&format=plain&rnd=new

نتيجة تنفيذ الرابط السابق مع قيمة num=10

457775

475847

101698

188990

115733

140834

368499

266327

284079

87163

إن شاء الله تكون هذه المعلومات مفيدة to somebody :)

5

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#12

لكن لكي لا يتكرر رقم حاول ان تستخدم

كائن static من random

#13
Mohammed Mshari Ersan كتب:

لكن لكي لا يتكرر رقم حاول ان تستخدم

كائن static من random

ممكن مثال برمجي أخي محمد، i'm not too much into Java لذلك قد يختلف تفسيري لجملتك عما قد تقصده.

1

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#14

السلام عليكم ...

مداخلة رائعة من X.

اقتباس
لكن لكي لا يتكرر رقم حاول ان تستخدم

كائن static من random

أعتقد أنك تقصد, أنه من الأفضل القيام بكل عمليات إنتاج الأعداد الأولية من خلال كائن Random واحد. لأن إنشاء كائنين في نفس اللحظة تقريباً, قد يؤدي إلى استخدام نفس الـ seed و الذي هو الوقت. طبعاً هذا يعتمد على الـ Resolution العائدة من دالة الوقت, و لكن بشكل عام كلامك صحيح و يجب أخذه بعين الاعتبار. إذا كنت تستخدم seeds مختلفة, بطريقة ما, فهنا لا مشكلة.

اقتباس
لكن بالطبع مثل هذه المولدات تحتاج إلى أجهزة Hardware تستطيع التقاط الطاقة

يمكنك استخدام dev/random في Linux :P

تحياتي...

1
#15

اصنع كائن static من Random

ٍ

static Random randomGen=new Random();

وحاول استدعاء هذا الكائن في كل مكان تحتاج فيه لعدد عشوائي

هذه الطريقة تضمن ما فوق ال 99.9999% عدم تكرار الرقم

و عن تجربه

مررت لها 10.000.000 محاولة و لم يتكرر فيها اي رقم

2
#16
Mohammed Mshari Ersan كتب:

اصنع كائن static من Random

ٍ

static Random randomGen=new Random();

وحاول استدعاء هذا الكائن في كل مكان تحتاج فيه لعدد عشوائي

هذه الطريقة تضمن ما فوق ال 99.9999% عدم تكرار الرقم

و عن تجربه

مررت لها 10.000.000 محاولة و لم يتكرر فيها اي رقم

فكرة معقولة وجيدة جداً.

طبعاً لا ننسى أن Random يعتمد على القيمة المعادة من System.currentTimeMillis() وهنا لدينا 24*60*60*1000 = 86,400,000 قيمة أولية للـ Seed

(10,000,000 جزء صغير منها) لكنها تبقى في مجال منته لكنه كاف لإجراء عدد كبير من الاختبارات كما ذكرت من قبل.

Khaled.Alshaya كتب:

يمكنك استخدام dev/random في Linux :P

واو

معلومة رائعة

Bg_037.gif

أستاااااااااااااااااااااااااااااذ :D

1

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#17

شكرا لكم جميعا على هذه المداخلات المفيييييييييده جدا,,

@محمد مشاري

مبروك على الغسالة الجديده :D

#18

كنت أبحث منذ قليل في تفاصيل حول dev/random

ما وجدته أنها تعاني من مشاكل إن لم يتم إعداد الدرايفر لاستخدام مقاطعات جيدة لجمع بيانات عشوائية، لأنه في حالة استدعائها مباشرة عند بدء النظام (من تطبيق ما) فقد لا يكون قد تم جمع بيانات عشوائية كافية لتلقينها للتطبيق وبالتالي .. كيف أعبر عن هذا.. the application gets jammed until data is available again -- أعتقد أن أفضل تمثيل لهذا هو Producer/Consumer (Semaphore)

على سبيل المثال في حال كون البيانات التي تجمع تأتي من حركة الماوس على سطح المكتب، فقد يعمل النظام ولا يكون هناك استخدام للماوس مباشرة بالتالي لا بيانات يمكن تجميعها.

حالة أخرى من حالات "التهنيج المؤقت" يكون في حال وجود أكثر من تطبيق (تطبيقات تعمل كـ server/client) يحاول الحصول على قيم عشوائية خاصة به، قريباً بسبب فراغ الـ 'pool' بسبب الطلب الكثيف على البيانات ستصل إلى حالة block مجدداً.

أعتقد أنها نقطة مهمة على المبرمجين معرفتها ولذلك رأيت ذكرها.

اقتباس

@محمد مشاري

مبروك على الغسالة الجديده :D

:D

تم تعديل هذه المشاركة بواسطة Xacker في 19 يونيو 2010 في 14:02

2

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#19

X

تريد الحصول على كل بياناتك العشوائية من dev/random ؟ طماع :lol:

بمجرد أن تحصل على seed, استخدمها في أي مولد للأعداد العشوائية.

#20

شكرا الدرس الرائع،

ولكن اذا فرضنا اننانريد ارقام عشوائية بدون تكرار الرقم بحث يصبح الرقام عشوائية بدون تكرار.

وشكرا............................................

#21
man_J كتب:

شكرا الدرس الرائع،

ولكن اذا فرضنا اننانريد ارقام عشوائية بدون تكرار الرقم بحث يصبح الرقام عشوائية بدون تكرار.

وشكرا............................................

استخدم الطريقة التي ذكرها الأخ Mohammed Mshari Ersan

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#22

موضوع شيق جدا و جميل ...

حسب اعتقادي . أنك إذا أردت الحصول على رقم عشوائي لا يتكرر .. فإن ذلك يتطلب خوارزمية تعتمد على الوقت الذي ينقضي في كل لحظة من خلال معادلة رياضية مناسبة.

مواضيع مشابهة