So, ich hab's mal schnell korrigiert. Besonders schön finde ich es auch nicht, aber es ist auf jeden Fall deterministisch.
Code: Alles auswählen
Define.i digits = 6
Define.i checksum = 3
Dim digit.i(digits - 1)
Define.i i, sum = 0
For i = 0 To digits - 1
digit(i) = Random(1000)
sum + digit(i)
Next
Define.f scale = checksum / sum
sum = 0
Debug ""
For i = 0 To digits - 1
digit(i) = Int(Round(digit(i) * scale, #PB_Round_Nearest)) % 10
sum + digit(i)
Next
Debug checksum - sum
While (checksum <> sum)
i = Random(digits - 1)
If (digit(i) < 9 And sum < checksum)
digit(i) + 1
sum + 1
ElseIf (digit(i) > 0 And sum > checksum)
digit(i) - 1
sum - 1
EndIf
Wend
Define.s result.s = ""
For i = 0 To digits - 1
result + Str(digit(i))
Next
Debug result
Kurzer Hintergrund:
Ich erstelle pro Ziffer zufällige Zahlen in einem beliebigen Bereich (hier 0-100), berechne deren Summe und skaliere dann jede Ziffer wieder so weit runter, dass ihre Summe gleich der Quersumme ist. Nach dem Runden kann das Ergebnis allerdings wieder abweichen, vor allem dann, wenn einzelne Ziffern größer als 9 sind. Diesen Bereich grenze ich dann ein und verteile anschließend noch zufällig die Differenz zur gewünschten Quersumme auf alle Ziffern.
Im Grunde kann man auch von Anfang an zufällige Zahlen zwischen 0 und 9 wählen und dann diese wieder zufällig anpassen. Mit meiner Version, die zuerst größere Zahlen erstellt, ist aber die Wahrscheinlichkeit höher, dass man am Schluss die Differenz zur gewünschten Quersumme nicht mehr so viel verteilen muss.