Jump to content

Generate random numbers without repeating a value: Difference between revisions

→‎{{header|JavaScript}}: Added a version in JavaScript
(Added Algol 68)
(→‎{{header|JavaScript}}: Added a version in JavaScript)
Line 479:
[19, 15, 10, 6, 17, 13, 14, 9, 2, 20, 3, 18, 8, 16, 7, 12, 1, 4, 5, 11]
</pre>
 
 
=={{header|JavaScript}}==
<lang javascript>(() => {
"use strict";
 
// ---------- NON-REPEATING RANDOM NUMBERS -----------
 
// main :: IO ()
const main = () =>
sortOn(Math.random)(
enumFromTo(1)(20)
);
 
 
// --------------------- GENERIC ---------------------
 
// comparing :: (a -> b) -> (a -> a -> Ordering)
const comparing = f =>
// The ordering of f(x) and f(y) as a value
// drawn from {-1, 0, 1}, representing {LT, EQ, GT}.
x => y => {
const
a = f(x),
b = f(y);
 
return a < b ? -1 : (a > b ? 1 : 0);
};
 
 
// enumFromTo :: Int -> Int -> [Int]
const enumFromTo = m =>
n => Array.from({
length: 1 + n - m
}, (_, i) => m + i);
 
 
// sortBy :: (a -> a -> Ordering) -> [a] -> [a]
const sortBy = f =>
// A copy of xs sorted by the comparator function f.
xs => xs.slice()
.sort((a, b) => f(a)(b));
 
 
// sortOn :: Ord b => (a -> b) -> [a] -> [a]
const sortOn = f =>
// Equivalent to sortBy(comparing(f)), but with f(x)
// evaluated only once for each x in xs.
// ('Schwartzian' decorate-sort-undecorate).
xs => sortBy(
comparing(x => x[0])
)(
xs.map(x => [f(x), x])
)
.map(x => x[1]);
 
// MAIN ---
return JSON.stringify(main());
})();</lang>
{{Out}}
For example:
<pre>[6,9,8,16,5,15,19,7,13,12,4,20,1,2,18,11,14,17,10,3]</pre>
 
=={{header|jq}}==
9,659

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.