Generate random numbers without repeating a value: Difference between revisions
Content added Content deleted
(→{{header|Haskell}}: Consolidated two very similar versions) |
No edit summary |
||
Line 866: | Line 866: | ||
<pre> |
<pre> |
||
[4, 19, 13, 8, 14, 6, 18, 20, 11, 16, 17, 7, 5, 9, 2, 15, 3, 1, 10, 12] |
[4, 19, 13, 8, 14, 6, 18, 20, 11, 16, 17, 7, 5, 9, 2, 15, 3, 1, 10, 12] |
||
</pre> |
|||
=={{header|Vlang}}== |
|||
{{trans|go}} |
|||
<lang vlang>import rand |
|||
import rand.seed |
|||
fn generate(from i64, to i64) { |
|||
if to < from || from < 0 { |
|||
println("Invalid range.") |
|||
} |
|||
span := int(to - from + 1) |
|||
mut generated := []bool{len: span} // all false by default, zero indexing |
|||
mut count := span |
|||
for count > 0 { |
|||
n := from + rand.i64n(span) or {0} // upper endpoint is exclusive |
|||
if !generated[n-from] { |
|||
generated[n-from] = true |
|||
print("${n} ") |
|||
count-- |
|||
} |
|||
} |
|||
println('') |
|||
} |
|||
fn main(){ |
|||
rand.seed(seed.time_seed_array(2)) |
|||
// generate 5 sets say |
|||
for i := 1; i <= 5; i++ { |
|||
generate(1, 20) |
|||
} |
|||
}</lang> |
|||
{{out}} |
|||
<pre>Same as Go entry</pre> |
|||
Alternatively and far more efficiently, we can simply create a list of the required numbers and randomly shuffle them. Vlang has a standard library function for this which uses the Fisher-Yates (aka Knuth) shuffle. |
|||
<lang vlang>import rand |
|||
import rand.seed |
|||
fn main(){ |
|||
rand.seed(seed.time_seed_array(2)) |
|||
mut numbers := []int{len:20, init:it+1} |
|||
// generate 5 sets say |
|||
for i := 1; i <= 5; i++ { |
|||
rand.shuffle<int>(mut numbers, rand.ShuffleConfigStruct{})? |
|||
s := "${numbers:2} " |
|||
println(s[1 .. s.len-2]) |
|||
} |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
Same as go entry |
|||
</pre> |
</pre> |
||