• 0
reem-akk

متى نحصل على أرقام عشوائية لا تتكرر

سؤال

هل يوجد طريقة للحصول على سلسلة أرقام عشوائية لا يوجد فيها تكرار ؟

ما الفرق بين العشوائية التامة والعشوائية المطلقة ؟ هل يقصد بالأولى أنه لا يوجد تكرار بين الأرقام العشوائية أم الثانية بمكن أن يوجد فيها تكرار؟

هل يوجد تعريف واف و كاف للسلسة العشوائية؟؟

0

شارك هذا الرد


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

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

  • 0

السلام عليكم

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

بالنسبة العشوائية التامة هى تساوى فرص الظهور بين للأعداد العشوائية والعشوائية المطلقة هى عشوائية بلا قيود .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
متى نحصل على أرقام عشوائية لا تتكرر

عندما يتم إستخدام خوارزميه جيده :lol:

1

شارك هذا الرد


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

بسم الله الرحمن الرحيم

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

فإن عقله قد لا شعوريا يختار خيار مميز ولو بشيء بسيط عن باقي الخيارات

أما في المعالج فإنه يتبع خوارزمية معينة حتى في العشوائية

فمثلا التابع rand() قام المبرمجون بتصميمه ليعتمد على عدة أمور معينة في كل مرة يختار بها

أما فكرة عدم تكرار رقم :

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

يمكن استخدام الكود التالي لذلك


int A[5],z=0,x;
for(i=0;i<6;++i)
{
x=rand();
for(int k=0;k<6;++k)
{
if(A[k]==x) { z=1; break; }
}
if (z==0) A[i]=x;
else --i;
}

كما يمكن استخدام التابع srand()

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

وغالبا ما تستعمل بذرة الوقت مع التابع srand() لإعطاء عشوائية شبه مطلقه

srand( time( NULL ) );
x=rand()

تم تعديل بواسطه KeepForward
0

شارك هذا الرد


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

شارك هذا الرد


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

جرّب أيضاً إستخدام دوال تولبد الأرقام العشوائية التي توفّرها مكتبة OpenSSL, مثال لـRAND_pseudo_bytes :

#include<stdio.h>
#include<openssl/rand.h>

/*
* $ gcc gen_random.c -o gen_random -lssl
* $ ./gen_random
*/

int main(void){

int array[1];
RAND_pseudo_bytes((unsigned char*) array, sizeof(array));
printf("%d\n", abs(array[0]));

}

إطلع على ويكيبيديا Random number generation ففيها الكثير من المعلومات الجيدة عن هذا الموضوع.

1

شارك هذا الرد


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

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

0

شارك هذا الرد


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

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

أخي الكريم ماالفرق بين random number و pseudo random number ؟

ولهذا تُسمّى 'pseudo random number generating' أي توليد رقم عشوائي غير حقيقية. أيّ عدد يُولد عن طريق خوارزمية ليس بعدد عشوائي تماماً. فمجرد إستخدام خورزمية "فيعني أنّ هناك نمط " وهذه ليست عشوائية. وربما لو عرفت مُدخلات الخوارزمية الأولى لإستطعت تكهّن جميع الأرقام التالية.

إنظر لهذه المعادلة , والصالحة للإستخدام في توليد الأرقام العشوائية :

%5Cnormalsize%5C!%28Z%20%20%5Ctimes%20L%20%2B%20I%29%5C%20mod%20%5C%20M.gif

المعادلة تأخذ أربع متغيرات في البداية Z و L و I و M. الأرقام M و I و Z ثابتة. تأخذ الرقم L في البداية وتحسب الناتج في الدورة الأولى لينتج الرقم الأول وفي الدورة الثانية تأخذ الرقم الناتج من الدورة الأولى وتعوضّه بـ L لينتج L جديد وهكذا تستمر الدورة.

كنت أعبث قبل قليل وكتبت سكربت python يولد صُورة كل بكسل فيها إختير من عشوائياً بلونين, 1 يُمثل الأبيض و 0 يُمثل الأسود وإنظر للصورة التي ولدتها تلك الخورزمية:

post-231926-051841000 1334834680_thumb.p

نتيجة ممتازة جداً. قارنها مع هذه الصُور :

post-231926-070151300 1334834782_thumb.p

هذه وُلدت بإستخدام rand مع srand

post-231926-011494100 1334834807_thumb.p

وهذه وُلدت بإستخدام RAND_pseudo_bytes

تقريباً ﻻ فرق. لكن الضعف في تلك الخورزمية سيظهر لو تمكنت من معرفة L الأولى, والتي لم تُختر عشوائياً 100%. في حال معرفتك لها, فالمعادلة خطية وسيمكنك معرفة جميع النتائج التالية.

هنُاك خوزرميات ضعيفة في الأصل وتظهر الصور هذا الضعف كنمط أو تكرار في أجزاء الصورة. إنظر لصورة, المصدر, مولدة بإسخدام دالة rand التابعة لـphp على ويندوز :

randbitmap_computer.png

ﻻحظ النمط. (يبدوا أنها مشكلة خاصة بويندوز لضعف في أحد دواله)

عملية التوليد الحقيقية للأرقام العشوائية تعتمد على إستخدام البيئة أو الأشياء المادية. مثلاً مكعب النرد Dice%201.gif يعطي أرقام عشوائية ﻻيُمكن التنبئ بها, أو صعبة جداً, لأنها ﻻتتبع نمط كخورزمية معينه لذا فذا رقم عشوائي حقيقي.

عملية التوليد الحقيقي للأرقام العشوائية يحتاج مُعدات وأجهزة متصلة بالطبيعة, فمثلاً يمكنك عمل ﻻقط صوت حساس وتضعه في شارع مزردحم وتولد عن طريق الأصوات التي يلتقطها أرقام عشوائية, طريقة إستخدام الضجيج noise. هناك موقع random.org يقدم مثل هذه الخدمة ويستخدم حسبما ذكر "الضجيج الجويّ". الحاجة لهذا النوع من التوليد تقتصر على الأشياء الحساسة والبحوث.

السكربت المستخدم في تلويد الصور الأولى :

#!/usr/bin/python
# -*- encoding: utf-8 -*-

__author__ = 'Barakat'
__license__ = 'GPL'


import cairo
import pango
import pangocairo
import random
import time
from ctypes import *
from ctypes.util import find_library

height, width = 200, 500

def draw_text(ctx, text):
pango_ctx = pangocairo.CairoContext(ctx)
pango_ctx.set_antialias(cairo.ANTIALIAS_SUBPIXEL)
layout = pango_ctx.create_layout()
font = pango.FontDescription('10')
layout.set_font_description(font)
layout.set_text(text)
ctx.set_source_rgb(0, 0, 0)
pango_ctx.update_layout(layout)
pango_ctx.show_layout(layout)


# Python builtin random module
sur = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
ctx = cairo.Context(sur)

ctx.set_source_rgb(1, 1, 1)
ctx.rectangle(0, 0, width, height)
ctx.fill()

for y in xrange(20, height):
for x in xrange(0, width):
color = random.choice((0, 1))
ctx.set_source_rgb(color, color, color)
ctx.rectangle(x, y, 1, 1)
ctx.fill()

draw_text(ctx, 'Python builtin random module')
ctx.stroke()
sur.write_to_png('random1.png')



# C rand with srand
sur = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
ctx = cairo.Context(sur)

ctx.set_source_rgb(1, 1, 1)
ctx.rectangle(0, 0, width, height)
ctx.fill()

c = CDLL(find_library("c"))
c.srand(c.time(None))

for y in xrange(20, height):
for x in xrange(0, width):
color = c.rand() % 2
ctx.set_source_rgb(color, color, color)
ctx.rectangle(x, y, 1, 1)
ctx.fill()

draw_text(ctx, 'C rand with srand')
ctx.stroke()
sur.write_to_png('random2.png')



# penSSL RAND_pseudo_bytes
sur = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
ctx = cairo.Context(sur)

ctx.set_source_rgb(1, 1, 1)
ctx.rectangle(0, 0, width, height)
ctx.fill()

ssl = CDLL(find_library('ssl'))

for y in xrange(20, height):
for x in xrange(0, width):
array = (c_ubyte * 1)()
ssl.RAND_pseudo_bytes(byref(array), sizeof(array))
color = array[0] % 2
ctx.set_source_rgb(color, color, color)
ctx.rectangle(x, y, 1, 1)
ctx.fill()

draw_text(ctx, 'OpenSSL RAND_pseudo_bytes')
ctx.stroke()
sur.write_to_png('random3.png')



# Simple PRNG "(Z * L + I) mod M"

sur = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
ctx = cairo.Context(sur)

ctx.set_source_rgb(1, 1, 1)
ctx.rectangle(0, 0, width, height)
ctx.fill()

L = time.gmtime().tm_sec / 2443.0
I = 51.0
M = 46.0
Z = 99.0

for y in xrange(20, height):
for x in xrange(0, width):
L = (Z * L + I) % M
color = int(L) % 2
ctx.set_source_rgb(color, color, color)
ctx.rectangle(x, y, 1, 1)
ctx.fill()

draw_text(ctx, 'Simple PRNG "(Z * L + I) mod M"')
ctx.stroke()
sur.write_to_png('random4.png')

2

شارك هذا الرد


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

السلام عليكم

الموضوع نسبي , فدالة توليد الأرقام العشوائية تنتج أرقام عشوائية بالنسبة لمستخدم الدالة على الرغم من كونها تتبع خوارزمية ما لإنتاج الأرقام وفى الغالب لا تحتاج العشوائية الطبيعة فى برامجك كما Mr.B إلا لدراسة ما تتطلب ذلك .

0

شارك هذا الرد


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

شكرا لكم وجزاكم الله كل الخير

طيب اذا كنت أريد أن أولد مجموعة أرقام عشوائية ترد فقط مرة واحدة وعددها مثلا 100 واستخدمت تابع موجود في الماتلاب اسمه randperm(100),

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

0

شارك هذا الرد


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

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

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