الانتقال إلى المحتوى

Creating Random Numbers in PL/SQL


عبداللطيف

Recommended Posts

tofeee

تحياتي لكم

لكل يوم معلومة جديدة تفيدني وتفيدكم

CREATE OR REPLACE PACKAGE random IS

 -- Returns random integer between [0, r-1]
 FUNCTION rndint(r IN NUMBER) RETURN NUMBER;

 -- Returns random real between [0, 1]
 FUNCTION rndflt RETURN NUMBER;

END;
/

CREATE OR REPLACE PACKAGE BODY random IS

 m         CONSTANT NUMBER:=100000000;  /* initial conditions */
 m1        CONSTANT NUMBER:=10000;      /* (for best results) */
 b         CONSTANT NUMBER:=31415821;   /*      */
 a         NUMBER;                      /* seed */
 the_date  DATE;                        /*      */
 days      NUMBER;                      /* for generating initial seed */
 secs      NUMBER;                      /*      */

 -- ------------------------
 -- Private utility FUNCTION
 -- ------------------------
 FUNCTION mult(p IN NUMBER, q IN NUMBER) RETURN NUMBER IS
   p1     NUMBER; 
   p0     NUMBER; 
   q1     NUMBER; 
   q0     NUMBER; 
 BEGIN p1:=TRUNC(p/m1); 
   p0:=MOD(p,m1); 
   q1:=TRUNC(q/m1); 
   q0:=MOD(q,m1); 
   RETURN(MOD((MOD(p0*q1+p1*q0,m1)*m1+p0*q0),m)); 
 END;

 -- ---------------------------------------
 -- Returns random integer between [0, r-1]
 -- ---------------------------------------
 FUNCTION rndint (r IN NUMBER) RETURN NUMBER IS 
 BEGIN -- Generate a random NUMBER, and set it to be the new seed
   a:=MOD(mult(a,+1,m); 

   -- Convert it to integer between [0, r-1] and return it
   RETURN(TRUNC((TRUNC(a/m1)*r)/m1));
 END;

 -- ----------------------------------
 -- Returns random real between [0, 1]
 -- ----------------------------------
 FUNCTION rndflt RETURN NUMBER IS
   BEGIN -- Generate a random NUMBER, and set it to be the new seed
     a:=MOD(mult(a,+1,m);
     RETURN(a/m);
   END;

BEGIN -- Generate initial seed "a" based on system date
 the_date:=SYSDATE;
 days:=TO_NUMBER(TO_CHAR(the_date, 'J'));
 secs:=TO_NUMBER(TO_CHAR(the_date, 'SSSSS'));
 a:=days*24*3600+secs;
END;
/
Method 2 - Produce random # between 0 to 32767 using seconds past midnight 
SELECT
 TRUNC( 
   (TO_NUMBER(SUBSTR(TO_CHAR(TO_NUMBER(TO_CHAR
                (SYSDATE,'sssss'))/86399),-7,7))
                 /10000000)*32767
 ) random 
FROM dual;

رابط هذا التعليق
شارك

مشكور جدا لقد قدم فى المنتدى حاجة مماثلة من قبل
و لكن اريد ان اسال سؤال
هل يمكن تحديد اكبر رقم و اصغر رقم لهذه الدالة ؟

تم تعديل بواسطة John
رابط هذا التعليق
شارك

شكر على المداخلات لكن كيف رقم اصغر واكبر ، ربما لم افهمك جيد


تحياتي

رابط هذا التعليق
شارك

  • بعد 7 شهور...
  • بعد 4 أسابيع...
  • بعد 1 شهر...
  • بعد 5 شهور...
  • بعد 1 شهر...

الأخ الكريم
مشكور على عملك و أريد أن ألفت النظر الى أن أوراكل لديها باكيج للتعامل مع القيم العشوائية dbms_random

رابط هذا التعليق
شارك

  • بعد 2 أسابيع...

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية