concrete RandomDemo { @type run () -> () } define RandomDemo { run () { Float timeLimit <- 0.0 Float startTime <- Realtime.monoSeconds() if (Argv.global().size() > 1) { timeLimit <- ParseChars.float(Argv.global().readAt(1)).getValue() } // Rough distribution of letter frequencies in the English language. // Taken from https://en.wikipedia.org/wiki/Letter_frequency. // NOTE: The overall scale here doesn't matter; it just matters what the // relative weights are. CategoricalTree only supports positive Int weights. CategoricalTree weights <- CategoricalTree.new() .setWeight('a',8167) .setWeight('b',1492) .setWeight('c',2782) .setWeight('d',4253) .setWeight('e',12702) .setWeight('f',2228) .setWeight('g',2015) .setWeight('h',6094) .setWeight('i',6966) .setWeight('j',153) .setWeight('k',772) .setWeight('l',4025) .setWeight('m',2406) .setWeight('n',6749) .setWeight('o',7507) .setWeight('p',1929) .setWeight('q',95) .setWeight('r',5987) .setWeight('s',6327) .setWeight('t',9056) .setWeight('u',2758) .setWeight('v',978) .setWeight('w',2361) .setWeight('x',150) .setWeight('y',1974) .setWeight('z',74) Generator letter <- weights `RandomCategorical:sampleWith` RandomUniform.probability() Generator length <- RandomGaussian.new(5.0,3.0) Generator timing <- RandomExponential.new(4.0) while (timeLimit <= 0.0 || Realtime.monoSeconds() < startTime+timeLimit) { // Generate a word with a random length. Int wordLength <- length.generate().asInt() if (wordLength < 1) { continue } CharBuffer buffer <- CharBuffer.new(wordLength) // Populate the letters using their relative frequencies. traverse (Counter.zeroIndexed(buffer.size()) -> Int pos) { \ buffer.writeAt(pos,letter.generate()) } // Print the word. \ BasicOutput.stdout() .write(String.fromCharBuffer(buffer)) .write("\n") .flush() // Wait a random amount of time. \ Realtime.sleepSeconds(timing.generate()) } } }