Bu konuda basit bir çözüm arıyorum ve ilk aklıma çağrışımsal diziler (associative array) geldi. Oradaki hashTable yapısı ile önceden ön göremeyeceğimiz bir sıralama tayin edebiliriz. Örneğin elimizde 100 kelimelik bir edebi metin olsun ve biz seçilen harflerin ışığında 1'den 100'e kadar rasgele sayı üretmek istiyoruz. İşte yöntem bu, sizce nasıl? Alternatifler olabilir mi?
import std.array, std.stdio;
void main(){
auto mısralar = [ "Korkma sönmez bu şafaklarda yüzen al sancak",
"Sönmeden yurdumun üstünde tüten en son ocak",
"O benim milletimin yıldızıdır parlayacak",
"O benimdir o benim milletimindir ancak",
"Çatma kurban olayım çehreni ey nazlı hilal",
"Kahraman ırkıma bir gül ne bu şiddet bu celâl",
"Sana olmaz dökülen kanlarımız sonra helal",
"Hakkıdır Hakka tapan milletimin istiklal",
"Ben ezelden beridir hür yaşadım hür yaşarım",
"Hangi çılgın bana zincir vuracakmış Şaşarım",
"Kükremiş sel gibiyim bendimi çiğner aşarım",
"Yırtarım dağları enginlere sığmam taşarım",
"Garbın âfâkını sarmışsa çelik zırhlı duvar",
"Benim iman dolu göğsüm gibi serhaddim var",
"Ulusun korkma Nasıl böyle bir imânı boğar",
"Medeniyet dediğin tek dişi kalmış canavar",
"Arkadaş yurduma alçakları uğratma sakın",
"Siper et gövdeni dursun bu hayâsızca akın",
"Doğacaktır sana vadettiği günler Hakkın",
"Kim bilir belki yarın belki yarından da yakın",
"Bastığın yerleri toprak diyerek geçme tanı",
"Düşün altındaki binlerce kefensiz yatanı",
"Sen şehid oğlusun incitme yazıktır atanı",
"Verme dünyâları alsan da bu cennet vatanı",
"Kim bu cennet vatanın uğruna olmaz ki feda",
"Şühedâ fışkıracak toprağı sıksan şühedâ",
"Cânı cânânı bütün varımı alsın da Hudâ",
"Etmesin tek vatanımdan beni dünyâda cüdâ",
"Rûhumun senden İlahî şudur ancak emeli",
"Değmesin ma bedimin göğsüne nâmahrem eli",
"Bu ezanlarki şehâdetleri dinin temeli",
"Ebedî yurdumun üstünde benim inlemeli",
"O zaman vecd ile bin secde eder varsa taşım",
"Her cerîhamdan İlâhî boşanıp kanlı yaşım",
"Fışkırır rûhı mücerred gibi yerden naşım",
"O zaman yükselerek arşa değer belki başım",
"Dalgalan sen de şafaklar gibi ey şanlı hilâl",
"Olsun artık dökülen kanlarımın hepsi helâl",
"Ebediyyen sana yok ırkıma yok izmihlâl",
"Hakkıdır hür yaşamış bayrağımın hürriyet",
"Hakkıdır Hakka tapan milletimin istiklâl"
];
int sırası;
int[string] sözcükler;
foreach(m; mısralar) {
foreach(s; splitter(m)) {
sözcükler[s] = sırası;
++sırası;
}
}
sözcükler.values.writeln;
sözcükler.length.writeln(" adet...");
} /* Çıktısı:
[101, 118, 194, 53, 242, 134, 5, 96, 63, 181, 179, 210, 84, 227, 117, 160, 245, 139, 132, 99,
141, 152, 56, 169, 94, 196, 236, 182, 206, 229, 65, 248, 174, 165, 82, 231, 11, 78, 95, 108,
18, 241, 230, 232, 189, 107, 146, 173, 103, 167, 212, 250, 31, 27, 112, 246, 12, 191, 59, 83,
154, 32, 220, 113, 256, 144, 131, 172, 4, 201, 213, 155, 239, 1, 218, 38, 92, 156, 235, 170,
183, 30, 190, 21, 109, 10, 251, 77, 142, 157, 110, 60, 23, 87, 143, 252, 234, 198, 184, 185,
171, 28, 253, 36, 20, 97, 166, 161, 79, 0, 153, 137, 145, 75, 68, 249, 73, 163, 54, 178, 192,
237, 158, 46, 127, 6, 41, 197, 128, 207, 162, 76, 26, 67, 208, 244, 186, 91, 193, 151, 104,
211, 69, 120, 221, 13, 72, 133, 135, 177, 89, 114, 222, 52, 35, 214, 100, 219, 106, 164, 7,
233, 255, 40, 105, 122, 254, 51, 238, 203, 102, 88, 188, 187, 93, 85, 74, 44, 126, 209, 195,
240, 204, 17, 45, 130, 90, 81, 136, 205, 168, 80, 61, 116, 25, 176, 175, 66, 71, 159, 228,
124, 70, 224, 216, 223, 140, 180, 62, 64, 225, 129, 138, 215, 202, 58, 226, 3, 150]
219 adet...*/
Aslında bunlar tekrarsız rasgele sayılar oldu. Ama benzer ve bağımsız bir yöntem daha başarılı olabilir...
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]