Using *rand in a choice

Using a shuffled array is nice because you don’t need variables to track whether a name was seen before; the shuffling ensures you see everything once, in a random order.

You’ve already gotten your answer, but I thought I’d share my crack at it just for fun:

*create name ""

*label name_randomizer
*temp offset 0
*temp human_name_1 "Arthur"
*temp human_name_2 "Alice"
*temp human_name_3 "Christopher"
*temp human_name_4 "Beatrice"
*temp human_name_5 "Frederick"
*temp human_name_6 "Elizabeth"
*temp human_name_7 "James"
*temp human_name_8 "Grace"
*temp human_name_9 "Louis"
*temp human_name_10 "Matilda"
*temp human_name_11 "Nicholas"
*temp human_name_12 "Penolope"
*temp human_name_13 "Richard"
*temp human_name_14 "Sophie"
*temp human_name_15 "Shiloh"
*temp human_name_16 "Quinn"
*temp human_name_17 "Emerson"
*temp human_name_18 "Marlowe"
*temp human_name_19 "Rory"
*temp human_name_20 "Rowan"
*gosub shuffle_array "human_name" 20


*label name_choice
What is your name?
*fake_choice
  #${human_name[1+offset]}
    *set name human_name[1+offset]
  #${human_name[2+offset]}
    *set name human_name[2+offset]
  #${human_name[3+offset]}
    *set name human_name[3+offset]
  #${human_name[4+offset]}
    *set name human_name[4+offset]
  #${human_name[5+offset]}
    *set name human_name[5+offset]
  #Show me more
    *if (offset < 15)
      *set offset + 5
      *goto name_choice
    *else
      You've seen all the names. Rerolling...
      *goto name_randomizer
Your name is ${name}?
*fake_choice
  #No, let me pick again.
    *goto name_choice
  #Yes.
    *finish


*label shuffle_array
*params array array_length
*temp i 1
*temp j 0
*label shuffle_array_loop
*if (i < array_length)
  *rand j i array_length
  *if (j != i)
    *temp val_i {(array&"_")&"${i}"}
    *set {(array&"_")&"${i}"} {(array&"_")&"${j}"}
    *set {(array&"_")&"${j}"} val_i
  *set i + 1
  *goto shuffle_array_loop
*return
8 Likes