Véletlenszerű karakterláncok előállítása

Véletlenszerűen előállított karakterláncokra számos esetben lehet szükség. Például hasznos lehet kereskedőknek promóciós kódok (kuponok) előállításához, vagy egy rendszer által biztosított jelszavak generálásához (pl. elfelejtett jelszó esetén). De használhatjuk véletlenszerűen előállított karakterláncok sorozatát egy program teszteléséhez is.

Véletlenszerű karakterláncok két módon is lehetnek véletlenszerűek. Lehet az értékük, azaz a karakterláncban szereplő karakterek véletlenek, vagy lehet a karakterlánc hossza véletlen, vagy mindkettő. Ez igényfüggő.

Mi most az általános eseten vesszük, vagyis olyan függvényeket készítünk, amelyek lehetővé teszik olyan karakterláncok sorozatának előállítását, amelyekben a karakterlánc értéke és hossza egyaránt véletlenszerű. De látni fogjuk, hogy megfelelő argumentumokkal meghívva, a speciális eseteknek is meg lehet felelni (pl. fix hosszú véletlenszerű karakterláncok is képezhetők).

Ha véletlen értékek előállítása a feladat, akkor a megvalósításhoz természetszerűleg első menetben a szabványos könyvtár random moduljához érdemes fordulni. Itt több eszköz is rendelkezésre áll, és döntenünk kell, hogy melyiket használjuk. Ez pedig a megoldandó feladattól függ.

A választást befolyásolja, hogy a generált karakterláncok mit, milyen karaktereket tartalmazhatnak. Csak betűket, csak számokat, vagy betűket és számokat is? Ha betűket, akkor csak ASCII vagy mást is. Vagy az igény sokkal általánosabb, és bármilyen Unicode karakter megengedett, sőt kívánatos az előállított karakterláncokban?

Ha például csak ASCII betűk kell, hogy szerepeljenek, akkor ezeket egy karaktersorozatban fel lehet sorolni (vagy ha nem akarunk túl sokat gépelni, a string modult használni) és ebből a random modul valamely megfelelő függvényével (choice, choices, sample) véletlenszerűen ki lehet választani a karaktert vagy karaktereket. Ha egész számok egy folytonos intervallumából kell számjegy karaktereket véletlenszerűen választani, akkor használható a randrange() vagy randint() függvény (és az eredmény karakterré konvertálása).

E tekintetben megint az általános igényt kívánjuk kielégíteni, vagyis olyan karakterláncokat generálni, amelyek tetszőlegesen meghatározható Unicode karaktereket tartalmazhatnak. Ebben az esetben a választható karakterek készletének felsorolása nem csak munkás, hanem a tévesztés veszélyével is jár, mert vannak képileg nagyon hasonló karakterek. Ezért ebben az esetben a megengedett karakterek Unicode kódpontjait célszerű meghatározni. Ez adott esetben még egyszerűsítheti és rugalmasabbá is tudja tenni a meghatározást, mert az összefüggő kódpont-blokkokat lehet a range objekummal definiálni, az egyéb karakterek kódpontjait pedig egy halmaz objektumban sorolhatjuk fel. /Használhatnánk valamilyen sorozat típusú konténert is (pl. list, tuple), de a halmaz előnye, hogy véd az ellen, ha véletlenül többször írnánk le ugyanazt a kódpont értéket./

Tegyük fel, hogy megvannak a választható karakterek kódpontjainak értékei. Melyik függvényt használjuk a véletlen kiválasztáshoz?

Ez megint feladat- és igényfüggő. Ha a generált karakterláncokban csak eltérő karakterek lehetnek, akkor a random modul sample() függvényét kell választani. Ha a karakterismétlődés megengedett, akkor a choice() vagy choices() függvényt. Ez utóbbi kettő között az alapvető eltérés, hogy míg a choice() egy sorozatból egyetlen elemet vesz ki véletlenszerűen, a choices() a k paraméterével meghatározott darabszámút.

Ha kriptográfiailag is megfelelő véletlen számokat akarunk generálni (pl. jelszavak, biztonsági tokenek előállításához) akkor az megint egy más igény; ebben az esetben a secrets modul choice() függvényét érdemes használni.

A fenti elvek és megfontolások alapján alább három, véletlen karakterláncokat előállító függvény definícióját látjuk. Ezek csak a visszatérési értéket meghatározó kifejezés kódjában térnek el egymástól. A visszatérési érték lehetne egy konténerobjektum is (pl. list vagy tuple), de ha nagyszámú karakterláncot kell előállítani, akkor ez memóriafelhasználás szempontjából hátrányos lehet, ezért mindegyik függvény egy generátorobjektummal tér vissza.

Véletlen számok előállításáról a Python tudásépítés lépésről lépésre című e-könyv „Készétel fogyasztás – a szabványos könyvtár moduljainak használata” fejezet „Matematikai számítások támogatása” alfejezetén belül a „A véletlen használatba vétele” címnél lehet részletesen olvasni. A karakterekről általában és az Unicode karakterkészletről pedig a „Mit teszünk, amikor programozunk?” fejezet „Karakter és karakterkészletek” alfejezetben kaphatunk egy áttekintést.

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.