Willekeur en verwachting: hoe “random” toch niet altijd random mag zijn

Willekeur en verwachting: hoe “random” toch niet altijd random mag zijn

Willekeurig 📅 13 October 2024 👁 62 weergaven

Toen ik jaren geleden een iOS-app in Objective-C ontwikkelde, kreeg ik van een klant een eenvoudige opdracht: “Laat willekeurige plaatjes zien.”

Klinkt simpel, toch? Een array met plaatjes, een random generator en klaar. Maar na de eerste test kreeg ik een opmerking terug: “Het mag niet voorkomen dat hetzelfde plaatje drie keer achter elkaar wordt getoond.”

Mijn eerste reactie was om uit te leggen dat dit nu juist is wat willekeurig betekent: alles kan gebeuren, ook drie keer hetzelfde. Maar de klant bedoelde eigenlijk dat de willekeurige ervaring voor de gebruiker minder repetitief en meer ‘afwisselend’ moest aanvoelen.

De eerste aanpak

Mijn eerste implementatie was zoiets:


NSArray *images = @[@"img1.png", @"img2.png", @"img3.png", @"img4.png"];
int randomIndex = arc4random_uniform((uint32_t)[images count]);
NSString *imageName = images[randomIndex];
UIImage *image = [UIImage imageNamed:imageName];
self.imageView.image = image;
  

Dit werkt prima: bij elke oproep wordt een willekeurig plaatje gekozen. Maar het kan dus gebeuren dat img2.png drie keer achter elkaar verschijnt.

De klantvraag: pseudo-willekeur

Om te voorkomen dat dezelfde afbeelding té vaak achter elkaar getoond wordt, heb ik een kleine logica toegevoegd die het laatst gekozen plaatje (of de laatste twee) onthoudt, en pas daarna opnieuw toestaat.


static NSString *lastImage = nil;
static NSString *secondLastImage = nil;

- (void)showRandomImage {
    NSArray *images = @[@"img1.png", @"img2.png", @"img3.png", @"img4.png"];
    NSString *newImage;
    
    do {
        int randomIndex = arc4random_uniform((uint32_t)[images count]);
        newImage = images[randomIndex];
    } while ([newImage isEqualToString:lastImage] && 
             [lastImage isEqualToString:secondLastImage]);
    
    // Update history
    secondLastImage = lastImage;
    lastImage = newImage;
    
    // Show image
    self.imageView.image = [UIImage imageNamed:newImage];
}
  

Hiermee wordt het onmogelijk dat een plaatje drie keer achter elkaar verschijnt, maar de willekeur blijft behouden.

Het verschil tussen random en ervaring

Wat ik hiervan leerde: “random” voor een programmeur is iets heel anders dan “random” voor een gebruiker of klant.

  • Voor de programmeur is willekeurig statistisch eerlijk – elk element heeft gelijke kans.
  • Voor de gebruiker betekent willekeurig vaak: afwisselend, niet voorspelbaar en zonder irritante herhalingen.

Door deze ervaring besefte ik dat code niet alleen de logica moet volgen, maar ook de beleving van de eindgebruiker moet ondersteunen.

Conclusie

Willekeur is niet altijd zo willekeurig als het lijkt. Soms moet je een klein beetje valsspelen om het gevoel van willekeur beter over te brengen. En dat is precies waar programmeren vaak om draait: de brug slaan tussen de exacte logica van code en de verwachtingen van mensen.

← Terug naar Blog