Zufalls-Zeichen und Zufalls-Text


Verweis-Tabelle

6566676869 7071727374 7576777879 8081828384 858687888990
ABCDE FGHIJ KLMNO PQRST UVWXYZ
Eine Tabelle von solchen und ähnlichen eindeutigen Verknüpfungen nennt man Verweis-Tabelle (Lookup-table). Man kann beliebige Verweis-Tabellen selbst erstellen.
Wenn die mit dem Bitmuster verknüpften Objekte Zeichen sind, dann nennt man die Tabelle → Zeichensatz. In jedem Betriebssystem sind die wichtigsten (standardisierten) Zeichensätze ohne besondere Maßnahmen bekannt.

Diese Tabelle zeigt einen Ausschnitt, der ist fast allen Zeichensätzen genauso enthalten ist, z.B. im → ASCII-Zeichensatz und im → Unicode-Zeichensatz.


Das kann man in der Tabellen-Kalkulation mit dieser Formel programmieren:
=ZEICHEN(GANZZAHL(ZUFALLSZAHL()*26)+65)
In den Kapiteln dieser Seite wird gezeigt, wie man diese Formel modifizieren kann, um verschiedene Zufalls-Aufgaben zu lösen.

Standard-Funktionen der Tabellen-Kalkulation


Ganze Zufallszahlen

Nach dieser Formel kann man Ganze Zufallszahlen zwischen der beliebigen Untergrenze ug und der Obergrenze og erzeugen:
z = ganzzahl(zufallszahl() * (og-ug+1)) + ug
Beide Grenzen sind inkludiert, d.h. es werden auch die Zufallszahlen ug und og selbst erzeugt.

Details zur → Erzeugung von Ganzen Zufallszahlen



Zahlen >=127 sollte man mit der Funktion ZEICHEN() nicht verwenden, weil das Ergebnis je nach Programm und Version unterschiedlich sein kann.

LibreOffice und OpenOffice bieten die Funktion UNIZEICHEN(), die beliebig große Zahlen als Argument akzeptiert. Damit kann man prinzipiell alle → Unicode-Zeichen erzeugen. Die Zeichen werden allerdings nur dann korrekt angezeigt, wenn sie in der verwendeten → Schrift-Familie enthalten sind.

MS-Excel akzeptiert mit der Funktion ZEICHEN() Argumente bis 255. Nur der Bereich 160...255 entspricht allerdings dem Unicode-Standard.
Derzeit ist es nur mit einer Basic-Funktion möglich, Unicode-Zeichen aus den Codenummern zuverlässig und portabel zu erzeugen.

Details zu den Themen → Zeichensatz, → ASCII, → Unicode, → Umlaute



Mit LibreOffice oder OpenOffice verwendet man besser die Funktion UNICODE(), die alle Unicode-Zeichen selbst dann übersetzen kann, wenn sie in der verwendeten → Schrift-Familie nicht enthalten sind.



Sonderfall: Das " Zeichen (Double quote) selbst wird entweder mit dem ASCII-Code 34 erzeugt oder mit 2 aufeinander folgenden "" Zeichen: Die Formel
= ZEICHEN(34) & "XYZ"""
erzeugt den Text "XYZ"



Die Basic-Funktion Unicode_Zeichen() wandelt eine beliebige Unicode-Zahl in das Zeichen um. Sie funktioniert mit jedem gängigen Kalkulations-Programm. So kann man auch mit MS-Excel Unicode-(Zufalls)-Zeichen erzeugen. Beispiel:
=Unicode_Zeichen(8364)
erzeugt das €-Zeichen.

Zufalls-Zeichen aus 1 Bereich


Beispiel für Großbuchstaben (ASCII 65...90):
=ZEICHEN(GANZZAHL(ZUFALLSZAHL()*26)+65)
Beispiel für Kleinbuchstaben (ASCII 97-122):
=ZEICHEN(GANZZAHL(ZUFALLSZAHL()*26)+97)
Beispiel für Ziffern (ASCII 48...57):
=ZEICHEN(GANZZAHL(ZUFALLSZAHL()*10)+48)



Beispiel für griechische Kleinbuchstaben (Unicode 945-969):
=ZEICHEN(GANZZAHL(ZUFALLSZAHL()*25)+945)



Die Basic-Funktion Zufalls_Zeichen() gibt ein Zeichen aus einem von 8 wählbaren Bereichen zurück. Mit dem Argument 1 werden zufällige Kleinbuchstaben erzeugt:
=Zufalls_Zeichen(1)

Zufalls-Zeichen aus mehreren Bereichen



Beispiel:  Ein Zufalls-Zeichen aus Ziffern (ASCII 48...57) und Großbuchstaben (ASCII 65...90) ist zu erzeugen.


(4) Im nächsten Schritt wird aus der berechneten Zufallszahl ein Zeichen erzeugt:
=ZEICHEN(WENN(ZUFALLSZAHL()<10/36; 48; 65))
Bei mehrfacher Anwendung wird nun in ca. 28% aller Fälle die Ziffer (nicht die Zahl) 0 angezeigt, in ca. 72% das Zeichen A

(5) An Stelle der einzelnen Zahlen (48; 65) werden die Formeln zur Erzeugung der Zeichen aus den einzelnen Bereichen eingesetzt (so wie im ↑ vorigen Kapitel gezeigt):
=ZEICHEN(WENN(ZUFALLSZAHL()<10/36; GANZZAHL(ZUFALLSZAHL()*10)+48; GANZZAHL(ZUFALLSZAHL()*26)+65)
Mit dieser Formel ist die Aufgabe gelöst.



Zufalls-Zeichen aus Ziffern, Groß- und Kleinbuchstaben:
=ZEICHEN(WENN(ZUFALLSZAHL()<10/62; GANZZAHL(ZUFALLSZAHL()*10)+48;
WENN(ZUFALLSZAHL()<1/2; GANZZAHL(ZUFALLSZAHL()*26)+65; GANZZAHL(ZUFALLSZAHL()*26)+97)) )
Die relativen Anteile der Bereiche werden nach jeder Verzweigung erneut berechnet. Der Anteil der Ziffern beträgt 10/(10+26+26). Die nächste Verzweigung entscheidet nur mehr zwischen den gleich großen Bereichen der Groß- und Kleinbuchstaben und verwendet daher den Anteil 1/2.

Mit zunehmender Anzahl der Bereiche wird die Programmierung rasch unübersichtlich. Man verwendet dann besser eine eigene Zelle für jeden Bereich und zuletzt eine Formel, die je nach den relativen Anteilen eines der Bereichs-Ergebnisse auswählt.



Die Basic-Funktion Zufalls_Zeichen() gibt ein Zeichen aus einem von 8 wählbaren Bereichen zurück. Mit dem Argument 5 wird je 1 zufälliges Zeichen aus den 3 Bereichen Ziffern, Großbuchstaben, Kleinbuchstaben erzeugt:
=Zufalls_Zeichen(5)

Zufalls-Text



Lösung:
="Demo" & (ZUFALLSZAHL()*1000+1)

Der konstante Text wird zwischen "" Double-quotes eingebettet.
Mit dem Operator & werden die beiden Text-Teile verknüpft.
Die Ganze Zufallszahl wird in () runde Klammern gesetzt, damit sie zuerst berechnet und erst danach in einen String umgewandelt wird.

Der erzeugte Text hat eine variable Länge von 5...8 Zeichen.


Die Formel lautet in diesem Fall
=ZUFALLSZAHL()*1000+1
Danach RechtsKlick auf die Zelle, Menü Zellen formatieren / Zahlen. In das Feld Format-Code wird eingetragen:
"Demo"0

Die Zufallszahl wird danach so angezeigt wie gewünscht, die Zelle enthält jedoch einen Zahlenwert, mit dem man problemlos rechnen kann.



Das Beispiel erzeugt in Zelle A1 einen aus 4 Teilen zusammengesetzten Text:
Das 1. Zeichen aus Zelle A3 ist ein Großbuchstabe X...Z
Danach folgen 1...3 Ziffern aus Zelle A4
Danach folgt ein - Zeichen
Das letzte Zeichen aus Zelle A5 ist ein Kleinbuchstabe a...c

Live-Beispiel:
X12-a

Es ist möglich, jedoch nicht sinnvoll, derartige Aufgaben in einer einzigen Formel zu programmieren.



In jeder Zelle des Bereichs A3:A5 wird ein Zufalls-Zeichen erzeugt.
In Zelle A1 werden alle (Zufalls)-Zeichen mit dem Ausdruck A3&A4&A5 verkettet.
Mit der Funktion LINKS() werden aus dem verketteten String so viele Zeichen entnommen, wie das 2.Argument angibt: Für dieses Argument wird eine Zufallszahl 1...3 programmiert.

Live-Beispiel:
AMZ



Alternative: Man fügt die maximale Anzahl von Füll-Zeichen ein und begrenzt danach die Länge je nach Anwendung mit den Funktionen RECHTS() oder LINKS()


In Zelle A3 wird die verlangte Zufallszahl erzeugt.
In Zelle A4 wird die Zahl in einen Text umgewandelt und davor die Füllzeichen 00 gesetzt. Aus dem kombinierten Text werden mit Funkjtion RECHTS() genau 3 Zeichen isoliert.
In Zelle A1 wird das Ergebnis zusammengesetzt.

An Stelle der für Zelle A4 angegebenen Formel kann man auch verwenden:
=TEXT(A3;"000")
Die Funktion TEXT() ist allerdings weniger zuverlässig.



Die Funktion Zufalls_Text() wird im Kapitel ↓ Basic dieser Seite genauer vorgestellt.
Man kann damit Text fixer oder variabler variabler Länge aus 8 verschiedenen wählbaren Bereichen erzeugen. Dieses Beispiel erzeugt mit einer einfachen Formel einen Zufallstext von 10...15 Zeichen Länge aus Groß- und Kleinbuchstaben.
=Zufalls_Zeichen(10;15;2)

Basic-Funktionen


Auf eigenen Seiten wird erklärt, wie man diese und andere Basic-Funktionen in eigene Dokumente (→ LibreOffice-Calc, → MS-Excel, → OpenOffice-Calc) einfügen kann.

Download des Basic-Moduls Random.bas mit diesen und anderen Funktionen.


Für MS-Excel muss man diese Option mit einem führenden Single-Quote Zeichen abschalten:
' Option VBASupport 1

Für LibreOffice oder OpenOffice muss man diese Option einschalten:
Option VBASupport 1


Basic-Quelltext:
Function Zufalls_Zeichen(BereichsWahl As Integer) As String
Dim i As Integer
Select Case BereichsWahl
Case 0
i = Int(Rnd * 26) + 65
Case 1
i = Int(Rnd * 26) + 97
Case 2
i = Int(Rnd * 52) + 65
If (i > 90) Then i = i + 6
Case 3
i = Int(Rnd * 36) + 48
If (i > 57) Then i = i + 7
Case 4
i = Int(Rnd * 36) + 48
If (i > 57) Then i = i + 39
Case 5
i = Int(Rnd * 62) + 48
If (i > 57) Then i = i + 7
If (i > 90) Then i = i + 6
Case 6
i = Int(Rnd * 10) + 48
Case 7
i = Int(Rnd * 16) + 48
If (i > 57) Then i = i + 7
End Select
Zufalls_Zeichen = Chr(i)
End Function


Basic-Quelltext:
Function Zufalls_Text(MinLaenge As Integer, MaxLaenge As Integer, BereichsWahl As Integer) As String
Dim i, imax As Integer
Dim s As String
imax = Int(Rnd * (MaxLaenge - MinLaenge + 1)) + MinLaenge
s = ""
Select Case BereichsWahl
Case 2, 3, 5
s = Zufalls_Zeichen(0)
imax = imax - 1
Case 4
s = Zufalls_Zeichen(1)
imax = imax - 1
End Select
For i = 1 To imax
s = s & Zufalls_Zeichen(BereichsWahl)
Next
Zufalls_Text = s
End Functions



Beispiel: So kann man einen zufälligen griechischen Kleinbuchstaben (Unicode 945...969) erzeugen:
=Unicode_Zeichen(Zufallszahl_Ganz(945;969))
Diese Funktion arbeitet in LibreOffice, MS-Excel oder OpenOffice.