Expose nondeterminism resulting from the OS thread scheduler
Perl 6, 27 bytes
await map {start .say},^100
Explanation:
map { },^100 # Iterate over the range 0..99, and for each of number:
start # Send the following task to a thread pool of OS threads:
.say # Print the number, followed by a newline.
await # Wait until all tasks have completed.
I hope this satisfies the task. (If not, please let me know).
Testing:
The shell script I used to test sufficient nondeterminism:
#!/usr/bin/bash
for i in {1..10}; do
set=""
for j in {1..10}; do
set="${set}$(perl6 nondet.p6 | tr '\n' ',')\n"
done
permutations="$(echo -e "$set" | head -n -1 | sort | uniq | wc -l)"
echo -n "$permutations "
done
For me, this outputs:
10 10 10 10 10 10 10 10 10 10
Setup instructions:
I ran the test with an up-to-date Rakudo Perl 6 on 64bit Linux, though I guess it'll work on other platforms.
The Rakudo download page has setup instructions. I compiled mine from git like this:
git clone [email protected]:rakudo/rakudo.git
cd rakudo
perl Configure.pl --gen-moar --make-install
export PATH="$(pwd)/install/bin/:$PATH"
Try it online:
Or just test it online, using this Try It Online link provided by @b2gills. I checked a few runs and got a different order each time, but haven't had the patience to run it 100 times through that online interface.
bash, 32 28 bytes
for i in {0..99};{ echo $i&}
I ran this 100 times and got 100 different results.
Edit: Saved 4 bytes thanks to @DigitalTrauma.
PowerShell, 54 46 44 39 bytes
workflow p{foreach -p($i in 0..99){$i}}
PowerShell Workflows are not supported in TIO, so you can't try it there. Should work great on your Windows 10 machine though :)
Defines a function p
which will output the list of numbers when invoked.
Timing
A single run reliably runs in about 600ms on my machine. The 100 tests defined below finish in under 2 minutes.
Testing
Here's complete code to test it:
workflow p{foreach -p($i in 0..99){$i}}
#workflow p{foreach($i in 0..99){$i}}
# uncomment above to prove testing methodology does detect duplicates
1..10 | % {
$set = $_
Write-Host "Set $set of 10"
1..10 | % -b {
$runs = @()
} -p {
$run = $_
Write-Host "-- Run $run of 10 in set $set"
$runs += "$(p)"
} -e {
Write-Host "-- There were $(10-($runs|Get-Unique).Count) duplicate runs in set $set"
}
}
Output on my machine:
Set 1 of 10 -- Run 1 of 10 in set 1 -- Run 2 of 10 in set 1 -- Run 3 of 10 in set 1 -- Run 4 of 10 in set 1 -- Run 5 of 10 in set 1 -- Run 6 of 10 in set 1 -- Run 7 of 10 in set 1 -- Run 8 of 10 in set 1 -- Run 9 of 10 in set 1 -- Run 10 of 10 in set 1 -- There were 0 duplicate runs in set 1 Set 2 of 10 -- Run 1 of 10 in set 2 -- Run 2 of 10 in set 2 -- Run 3 of 10 in set 2 -- Run 4 of 10 in set 2 -- Run 5 of 10 in set 2 -- Run 6 of 10 in set 2 -- Run 7 of 10 in set 2 -- Run 8 of 10 in set 2 -- Run 9 of 10 in set 2 -- Run 10 of 10 in set 2 -- There were 0 duplicate runs in set 2 Set 3 of 10 -- Run 1 of 10 in set 3 -- Run 2 of 10 in set 3 -- Run 3 of 10 in set 3 -- Run 4 of 10 in set 3 -- Run 5 of 10 in set 3 -- Run 6 of 10 in set 3 -- Run 7 of 10 in set 3 -- Run 8 of 10 in set 3 -- Run 9 of 10 in set 3 -- Run 10 of 10 in set 3 -- There were 0 duplicate runs in set 3 Set 4 of 10 -- Run 1 of 10 in set 4 -- Run 2 of 10 in set 4 -- Run 3 of 10 in set 4 -- Run 4 of 10 in set 4 -- Run 5 of 10 in set 4 -- Run 6 of 10 in set 4 -- Run 7 of 10 in set 4 -- Run 8 of 10 in set 4 -- Run 9 of 10 in set 4 -- Run 10 of 10 in set 4 -- There were 0 duplicate runs in set 4 Set 5 of 10 -- Run 1 of 10 in set 5 -- Run 2 of 10 in set 5 -- Run 3 of 10 in set 5 -- Run 4 of 10 in set 5 -- Run 5 of 10 in set 5 -- Run 6 of 10 in set 5 -- Run 7 of 10 in set 5 -- Run 8 of 10 in set 5 -- Run 9 of 10 in set 5 -- Run 10 of 10 in set 5 -- There were 0 duplicate runs in set 5 Set 6 of 10 -- Run 1 of 10 in set 6 -- Run 2 of 10 in set 6 -- Run 3 of 10 in set 6 -- Run 4 of 10 in set 6 -- Run 5 of 10 in set 6 -- Run 6 of 10 in set 6 -- Run 7 of 10 in set 6 -- Run 8 of 10 in set 6 -- Run 9 of 10 in set 6 -- Run 10 of 10 in set 6 -- There were 0 duplicate runs in set 6 Set 7 of 10 -- Run 1 of 10 in set 7 -- Run 2 of 10 in set 7 -- Run 3 of 10 in set 7 -- Run 4 of 10 in set 7 -- Run 5 of 10 in set 7 -- Run 6 of 10 in set 7 -- Run 7 of 10 in set 7 -- Run 8 of 10 in set 7 -- Run 9 of 10 in set 7 -- Run 10 of 10 in set 7 -- There were 0 duplicate runs in set 7 Set 8 of 10 -- Run 1 of 10 in set 8 -- Run 2 of 10 in set 8 -- Run 3 of 10 in set 8 -- Run 4 of 10 in set 8 -- Run 5 of 10 in set 8 -- Run 6 of 10 in set 8 -- Run 7 of 10 in set 8 -- Run 8 of 10 in set 8 -- Run 9 of 10 in set 8 -- Run 10 of 10 in set 8 -- There were 0 duplicate runs in set 8 Set 9 of 10 -- Run 1 of 10 in set 9 -- Run 2 of 10 in set 9 -- Run 3 of 10 in set 9 -- Run 4 of 10 in set 9 -- Run 5 of 10 in set 9 -- Run 6 of 10 in set 9 -- Run 7 of 10 in set 9 -- Run 8 of 10 in set 9 -- Run 9 of 10 in set 9 -- Run 10 of 10 in set 9 -- There were 0 duplicate runs in set 9 Set 10 of 10 -- Run 1 of 10 in set 10 -- Run 2 of 10 in set 10 -- Run 3 of 10 in set 10 -- Run 4 of 10 in set 10 -- Run 5 of 10 in set 10 -- Run 6 of 10 in set 10 -- Run 7 of 10 in set 10 -- Run 8 of 10 in set 10 -- Run 9 of 10 in set 10 -- Run 10 of 10 in set 10 -- There were 0 duplicate runs in set 10