Softanza
StartFrançais
Softanza
Research · narration

Practical Randomness in Softanza

Softanza makes it simple to apply probabilities—ideal for AI simulations, statistical modeling, and game mechanics.

by Mansour Ayouni · in the repository since 2025-09-14 · feature essay · area Numeric & optimization

Softanza builds on Haro’s C-based random engine by offering semantic APIs that cover the most common randomness needs in programming. Instead of low-level calls, you get expressive functions for probabilities, list shuffling, string randomization, and reproducible test data.

Probabilistic Functions

Haro
aNumbers = [ 12, 9, 10, 7, 25, 12, 9, 8 ]
? Some(aNumbers)
#--> [ 12, 10, 7 ]

? Few(NumbersIn(-5:5))
#--> [ 0, -4 ]

? Most(PositiveNumbersIn(-5:5))
#--> [ 1, 2, 4, 5 ]

? Half(OddNumbersIn(-5:5))
#--> [ 1, 5 ]

illustration

Example: Loot Drop System

Haro
acTreasureChest = [ "gold", "sword", "potion", "gem", "scroll" ]

acRareItems = Few(acTreasureChest)      # 10% chance items
? @@(acRareItems)
#--> [ "gold" ]

acCommonItems = Most(acTreasureChest)   # 70% chance items
? @@(acCommonItems)
#--> [ "sword", "gem", "gold", "scroll" ]

illustration

For finer control, you can specify exact probabilities using the extended forms:

Haro
? SomeXT(NumbersIn(-5:5), 20/100)
#--> [ -5, 0, 4 ]

? MostXT(PositiveNumbersIn(-5:5), 90/100)
#--> [ 3, 4, 5, 1 ]

illustration

Configuration Functions

You can configure randomness globally: set the probability ratio for Some() and control the decimal precision (round in Haro/Softanza).

Haro
# Default configuration
? DefaultSome()
#--> 0.3

# Change decimal precision (e.g., for currency)
SetRandomRound(4)

# Set volatility probability (25%)
SetSome(0.25)

illustration

This is especially useful in domains like financial simulations, where precision and consistency matter.

Core Random Functions

For low-level randomness, Softanza provides number generators with seed control—perfect for reproducible results.

Haro
? ARandomNumber()
#--> 133_322_384

? ARandomNumberXT(77)
#--> 32_438_4546

illustration

Generate test data that can be replayed identically:

Haro
nTestSeed = 12345
anUserIds = []

for i = 1 to 1000
    anUserIds + ARandomNumberXT(nTestSeed + i)
next

? ShowShort(anUserIds)
#--> [ 7587, 7590, 7593, "...", 10843, 10846, 10849 ]

illustration


Generating Random Numbers

Produce numbers within constraints:

Haro
? ARandomNumberLessThan(10)
#--> 2

? RandomNumberBetween(100, 150)
#--> 149

? NRandomNumbersBetweenU(3, 100, 110)
#--> [ 102, 109, 105 ]

illustration

Softanza also supports negative numbers:

Haro
? random01()
#--> 0.61

? ARandomNumberBetween(-3.5, 2.8)
#--> -2.45

SetRandomRound(3)
? ARandomNumberLessThan01(0.7)
#--> 0.557

? StzRandom(-10)
#--> -5

? SomeRandomNumbersBetween(-10, -1)
#--> [ -10, -10, -4 ]

illustration

Random Strings and Lists

Randomness isn’t only about numbers—you can generate strings and shuffle lists too.

Haro
Q("123456789") {
    ? ARandomSection()
    #--> "234"
    
    ? SomeRandomSections()
    #--> [ "345678", "4567" ]
}

Q("SOFTANZA") {
    ? ARandomChar()
    #--> "T"
    
    ? ARandomCharAfterPosition(4)
    #--> "A"
    
    ? ARandomCharExcept("A")
    #--> "S"
}

illustration

Example: Password Generator

Haro
cCharSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
	   "0123456789" + "#!@~_" +
	   "abcdefghijklmnopqurstuvwxyz"
	  
cPassword = ""

for i = 1 to 8
    cPassword += Q(cCharSet).ARandomChar()
next

? cPassword
#--> @3Ond72H
#--> 2z47AD@Z
#--> LrmaUo7Z

illustration

Shuffling and Sampling

Haro
# Full shuffle
aDeck = [ 1, 2, 3, 4, "A", "B", "C", "D" ]
o1 = new stzList(aDeck)
o1.Randomize()
? @@(o1.Content())
#--> [ "D", 4, "A", 3, "C", 2, 1, "B" ]

# Shuffle only numbers
aDeck = [ 1, 2, 3, 4, "A", "B", "C", "D" ]
o1 = new stzList(aDeck)
o1.RandomizeNumbers()
? @@(o1.Content())
#--> [ 4, 1, 2, 3, "A", "B", "C", "D" ]

# Shuffle only a section
aDeck = [ 1, 2, 3, 4, "A", "B", "C", "D" ]
o1 = new stzList(aDeck)
o1.RandomizeSection(5, 8)
? @@(o1.Content())
#--> [ 1, 2, 3, 4, "D", "A", "C", "B" ]

illustration

Card Game Example

Haro
nCards = 1:52
oGameDeck = new stzList(nCards)

oGameDeck.Randomize()
anPlayerHand = oGameDeck.FirstN(5)

? @@(anPlayerHand)
#--> [ 48, 20, 6, 51, 35 ]

illustration

And for simple item selection:

Haro
? ARandomItemIn("A":"E")
#--> B

? NRandomItemsInU(3, "A":"E")
#--> [ "B", "E", "A" ]

acPlayerChoices = [ "rock", "paper", "scissors" ]
? ARandomItemIn(acPlayerChoices)
#--> "paper"

illustration


✨ With these APIs, randomness in Softanza becomes predictable when needed, configurable when required, and expressive by design.

Cite

Mansour Ayouni. "Practical Randomness in Softanza". Softanza narrations, 2025. https://mayouni.github.io/stzsite/en/narrations/stz-random-narrration.html

Not run: its code touches files, the network, the clock or chance. The article is published as written; its blocks are illustrations. The code of the articles is Haro code. Where an article was written before the language took its present name, the name was changed and nothing else. Genre, area and series read from the file's name, the year from its first commit: derived, until the article carries its own header. The file on GitHub(opens in a new tab)