SVID Rasgele Sayı İşlevleri
Önceki Rasgeleymiş gibi Görünen Sayılar Sonraki
SVID Rasgele Sayı İşlevleri
SVID sistemlerdeki C kütüphanesi rasgele sayı üretim işlevlerinin daha farklı çeşitlerini içerir. Kullanıcı farklı biçimlerde rasgele bitler döndüren işlevler arasından seçim yapabilir.
Genel olarak iki çeşit işlev vardır. İlki çeşitli işlevler ve sürecin tüm evreleri tarafından paylaşılan bir rasgele sayı üreteci durumunu kullanır. İkincisi ise durumu kullanıcının elde etmesini gerektirir.
Tüm işlevler aynı sabitlerle aynı benzeş[97] formülü kullanırlar. Bu formül:
    Y = (a * X + c) mod m
Burada, X üretecin başlangıçtaki durumu, Y ise son durumudur. a ve c üretecin çalışma yöntemini belirleyen sabitlerdir. Öntanımlı olarak bunlar:
    a = 0x5DEECE66D = 25214903917
    c = 0xb = 11
Ancak, bunlar kullanıcı tarafından değiştirilebilir. m ise, durum bilgisi 48 bitlik bir diziden oluştuğundan 2^48'dir.
Bu işlevlerin prototipleri stdlib.h başlık dosyasındadır.
double drand48
(void)
işlev
Bu işlev double türünde 0.0 ile 1.0 (hariç) arasında bir değerle döner. Rasgele bitler C kütüphanesindeki rasgele sayı üretecinin genel durum bilgisi tarafından belirlenir.
IEEE 754'de double türü 52 bitlik ondalık kısımdan oluştuğundan bunun 4 biti rasgele sayı üreteci tarafından ilklendirilemez. Bunlar (şüphesiz) en kıymetsiz bitlerden seçilir ve 0'a ilklendirilir.
double erand48
(unsigned short int xsubi[3])
işlev
Bu işlev drand48 işlevi gibi double türünde 0.0 ile 1.0 (hariç) arasında bir değerle döner. Argüman rasgele sayı üretecinin durumunu ifade eden bir dizidir.
Bu işlev rasgele sayıları garantilemek için diziyi güncellediğinden ardarda çağrılabilir. Dizi, yeniden üretilebilir sonuç sağlamak için ilk kullanımdan önce ilklendirilmelidir.
long int lrand48
(void)
işlev
lrand48 işlevi 0 ile 2^31 (hariç) arasında bir tamsayı değerle döner. Dönen değerin türü long int olsa bile 32 bitten daha geniş değildir, dolayısıyla daha yüksek bir değer dönmez. Rasgele bitler C kütüphanesindeki rasgele sayı üretecinin genel durum bilgisi tarafından belirlenir.
long int nrand48
(unsigned short int xsubi[3])
işlev
Bu işlev lrand48 işlevi gibi 0 ile 2^31 (hariç) arasında bir tamsayı değerle döner, ama rasgele bitleri üretmekte kullanılan rasgele sayı üreteci durum bilgisi işleve parametre olarak verilen dizi tarafından belirlenir.
Bu işlev rasgele sayıları garantilemek için diziyi güncellediğinden ardarda çağrılabilir. Dizi, yeniden üretilebilir sonuç sağlamak için ilk kullanımdan önce ilklendirilmelidir.
long int mrand48
(void)
işlev
mrand48 işlevi -2^31 ile 2^31 (hariç) arasında sayı döndürmesi dışında lrand48 işlevi gibidir.
long int jrand48
(unsigned short int xsubi[3])
işlev
jrand48 işlevi -2^31 ile 2^31 (hariç) arasında sayı döndürmesi dışında lrand48 işlevi gibidir. xsubi parametresi için gereksinimler aynıdır.
Rasgele sayı üretecinin ilk durumu çeşitli yollarla ilklendirilebilir. Yöntemler sağlanan bilginin bütünlüğüne bağlı olarak değişir.
void srand48
(long int tohum)
işlev
srand48 işlevi rasgele sayı üretecinin dahili durumunun en kıymetli 32 bitine, tohum parametresinin en kıymetsiz 32 bitini yerleştirir. Alt 16 bit 0x330E değeri ile ilklendirilir. long int türü 32 bitten daha fazla bit içerse bile sadece alt 32 biti kullanılır.
Bu sınırlamayla, bu işlevin durumu ilklendirmesi çok kullanışlı değildir, ama srand48 (time (0)) gibi bir kullanım onu kolay kullanılır yapar.
Bu işlevin bir yan etkisi, dahili durumda benzetimli formüldeki a ve c değerleri yukarıda verilen öntanımlı değerlere ayarlanır. This is of importance once the user has called the lcong48 function (see below).
unsigned short int *seed48
(unsigned short int tohum16[3])
işlev
seed48 işlevi dahili rasgele sayı üretecinin durumunun 48 bitinin tamamını tohum16 parametresinin içeriğinden ilklendirir. Burada tohum16 dizisinin ilk elemanının alt 16 biti dahili durumun en kıymetsiz 16 bitini ilklendirir, tohum16[1]'in alt 16 biti durumun ortadaki 16 bitini ilklendirir, tohum16[2]'nin alt 16 biti de durumun en kıymetli 16 bitini ilklendirir.
srand48 işlevinin tersine bu işlev kullanıcının durumun tüm 48 bitini ilklendirmesini sağlar.
İşlevin dönüş değeri dahili durumun değişmeden önceki değerini içeren bir dizidir. Bu dizi rasgele sayı üretecini belirli bir durumdan tekrar başlatmak için kullanılabilir. Aksi takdirde değer yoksayılabilir.
srand48'deki gibi benzetimli formüldeki a ve c değerleri öntanımlı değerlere ayarlanır.
Rasgele sayı üretecini ilklendirmek için benzetimli formüldeki parametreleri değiştirebilmenizi sağlayarak daha fazla bilgi belirtebilmenizi mümkün kılan bir işlev daha vardır.
void lcong48
(unsigned short int param[7])
işlev
lcong48 işlevi rasgele sayı üretecinin durumunu tamamen değiştirebilmenizi mümkün kılar. srand48 ve seed48 işlevlerinin aksine, bu işlev ile ayrıca benzetimli formüldeki sabitleri de değiştirebilirsiniz.
param dizisindeki 7 elemandan 0, 1, 2 indisli elemanlardaki girdilerin en kıymetsiz 16 biti ilk durumu belirler; 3, 4, 5 indisli elemanlardaki girdiler 48 bitlik a sabitini, 6. elemanın girdisi ise 16 bitlik c değerini belirler.
Yukardaki işlevlerin hepsi ortak olarak benzetimli formüldeki genel parametreleri kullanır. Çok evreli yazılımlarda kimi zaman farklı evrelerde farklı parametrelere sahip olmak kullanışlı olabilir. Bu sebeple yukardaki işlevlerin tümünün rasgele sayı üreteci durumunu genel durum yerine kullanıcı tanımlı bir tamponda tutarak çalışan sürümleri de vardır.
Tüm evrelerin durumu içeren bir diziye gösterici alan işlevleri kullanması durumunda böyle bir sorunun olmayacağına dikkat edin. Aşağıda hesaplanan rasgele sayılar aynı döngüyü izler ama eğer dizideki durum farklıya tüm evrelerin kendilerine özel bir rasgele sayı üreteci olacaktır.
Kulanıcı tanımlı tampon struct drand48_data türünde olmalıdır. Bu türün şeffaf olmadığı kabul edilir, dolayısıyla doğrudan değiştirilmemelidir.
int drand48_r
(struct drand48_data *tampon,
 double              *sonuç)
işlev
Bu işlev, genel rasgele sayı üreteci parametrelerini değiştirmemesi, ama bunun yerine tampon göstericisi üzerinden sağlanan tampondaki parametreleri değiştirmesi ile drand48 işlevinden farklıdır. Rasgele sayı sonuç ile gösterilen değişkende döndürülür.
İşlevin dönüş değeri çağrının başarısını gösterir. Eğer dönüş değeri 0'dan küçükse bir hata oluşmuştur. Bu durumda errno değişkenine hata durumu atanır.
Bu işlev bir GNU oluşumu olduğundan taşınabilir yazılımlarda kullanılmamalıdır.
int erand48_r
(unsigned short int   xsubi[3],
 struct drand48_data *tampon,
 double              *sonuç)
işlev
erand48_r işlevi erand48 gibi çalışır, ama rasgele sayı üretecini ifade eden bir tampon argümanı alır. Rasgele sayı üretecinin durumu xsubi dizisinden alınır. Rasgele sayı sonuç ile gösterilen değişkende döndürülür.
Çağrı başarılı olmuşsa dönüş değeri negatif bir değer değildir.
Bu işlev bir GNU oluşumu olduğundan taşınabilir yazılımlarda kullanılmamalıdır.
int lrand48_r
(struct drand48_data *tampon,
 double              *sonuç)
işlev
Bu işlev lrand48 işlevine benzer, ama ek olarak drand48 işlevindeki gibi rasgele sayı üretecinin durumunu ifade eden tampona bir gösterici alır.
İşlevin dönüş değeri negatif değilse sonuç sonuç ile gösterilen değişkende döndürülür. Aksi takdirde bir hata oluşmuş demektir.
Bu işlev bir GNU oluşumu olduğundan taşınabilir yazılımlarda kullanılmamalıdır.
int nrand48_r
(unsigned short int   xsubi[3],
 struct drand48_data *tampon,
 long int            *sonuç)
işlev
nrand48_r işlevi nrand48 işlevi gibi 0 ile 2^31 arasında bir rasgele sayı üretir. Fakat, benzetimli formül için genel parametreleri kullanmak yerine tampon ile gösterilen tampondaki bilgiyi kullanır. Durum xsubi dizisindeki değerlerle ifade edilir.
İşlevin dönüş değeri negatif değilse sonuç sonuç ile gösterilen değişkende döndürülür.
Bu işlev bir GNU oluşumu olduğundan taşınabilir yazılımlarda kullanılmamalıdır.
int mrand48_r
(struct drand48_data *tampon,
 double              *sonuç)
işlev
Bu işlev mrand48 işlevine benzer. Fakat bu işlev ailesinin diğer evresel işlevleri gibi bu işlev de tampon ile gösterilen tampondaki değerle ifade edilen rasgele sayı üretecini kullanır.
İşlevin dönüş değeri negatif değilse sonuç sonuç ile gösterilen değişkende döndürülür.
Bu işlev bir GNU oluşumu olduğundan taşınabilir yazılımlarda kullanılmamalıdır.
int jrand48_r
(unsigned short int   xsubi[3],
 struct drand48_data *tampon,
 long int            *sonuç)
işlev
jrand48_r işlevi jrand48 işlevine benzer. Fakat bu işlev ailesinin diğer evresel işlevleri gibi bu işlev de benzetimli formülün parametrelerini tampon ile gösterilen tampondan kullanır.
İşlevin dönüş değeri negatif değilse sonuç sonuç ile gösterilen değişkende döndürülür.
Bu işlev bir GNU oluşumu olduğundan taşınabilir yazılımlarda kullanılmamalıdır.
Yukarıdaki evresel işlevleri kullanmadan önce struct drand48_data türündeki tampon ilklendirilmelidir. Bunu yapmanın en kolay yolu tüm tamponu boş karakterle doldurmaktır:
memset (buffer, '\0', sizeof (struct drand48_data));
Bundan sonra bu ailenin evresel işlevlerinin kullanılması rasgele sayı üretecini durum ve benzetimli formülün parametreleri için öntanımlı değerlere özdevinimli olarak ilklendirecektir.
Diğer bir olasılık, işlevleri tamponu açıkça ilklendirerek kullanmaktır. İşlevin parametrelerine bakarak tamponun nasıl ilklendirileceği açıkça belli olduğuna göre sonuç daima umduğunuz olmayacağından bu işlevleri kullanmanızı hararetle tavsiye ediyoruz.
int srand48_r
(long int             tohum,
 struct drand48_data *tampon)
işlev
Rasgele sayı üreteci srand48 işlevindeki gibi tampon içindeki bilgi ile ifade edilir. Durum tohum parametresinden ilklendirilir ve benzetimli formülün parametreleri de öntanımlı değerleriyle ilkelendirilir.
İşlevin dönüş değeri negatif değilse işlev başarılıdır.
Bu işlev bir GNU oluşumu olduğundan taşınabilir yazılımlarda kullanılmamalıdır.
int seed48_r
(unsigned short int   tohum16[3],
 struct drand48_data *tampon)
işlev
Bu işlev srand48_r işlevine benzer ama seed48 işlevi gibi durumun 48 bitinin tamamını tohum16 parametresinden ilklendirir.
İşlevin dönüş değeri negatif değilse işlev başarılıdır. seed48 işlevinin yaptığı gibi rasgele sayı üretecininönceki durumuna bir gösterici döndürmez. Eğer kullanıcı daha sonra kullanmak üzere durum bilgisini saklamak isterse tampon ile gösterilen tamponun tamamını kopyalayabilir.
Bu işlev bir GNU oluşumu olduğundan taşınabilir yazılımlarda kullanılmamalıdır.
int lcong48_r
(unsigned short int   param[7],
 struct drand48_data *tampon)
işlev
Bu işlev tampon ile ifade edilen rasgele sayı üretecininin tüm özelliklerini param içindeki veri ile ilklendirir. Burada işlevin param ve tampon içeriklerini kopyalamaktan daha fazlasını yaptığı bir gerçektir. Daha fazla çalışma gerektirmesi ve bundan dolayı bu işlevi kullanmak rasgele sayı üretecini doğrudan ilklendirmekten daha iyidir.
İşlevin dönüş değeri negatif değilse işlev başarılıdır.
Bu işlev bir GNU oluşumu olduğundan taşınabilir yazılımlarda kullanılmamalıdır.


[97] Ç.N.: Benim, "benzeş formül" diye adlandırdığım formülden özgün metinde "congruential formula" ismiyle bahsedilmiş. Bunun kullanımda olan bir türkçe karşılığı var mı bilmiyorum ama tam tarifi şöyle: özgün formülle tıpatıp aynısı olmasa da benzer sonucu veren (ve belki hesaplama kolaylığı getiren) bir başka formül. -- [NBB]
Önceki Üst Ana Başlık Sonraki
BSD Rasgele Sayı İşlevleri Başlangıç Hızlı Kod mu, Küçük Kod mu Tercih Edilir?
Bir Linux Kitaplığı Sayfası