challenge 重複無し乱数

整数nを渡すと1 ~ n までの整数を重複しないようランダムに出力する関数「bingo」を作ってください。

このお題はraynstardさんの投稿を元にしています。ご投稿ありがとうございました。 投稿の内容には表示のしかたも含まれていたのですが、 このお題では「重複しない1~nまでの乱数をどうやって作るか」という点に集中することにして、 結果の整形は続編としてこの後のお題で出すことにします。 サンプル入出力は下のようになります。

>>> bingo(10)
[10, 7, 8, 4, 5, 2, 3, 1, 6, 9]
>>> bingo(3)
[2, 3, 1]
>>> bingo(3)
[2, 3, 1]
>>> bingo(3)
[3, 1, 2]
>>> bingo(10)
[7, 3, 8, 6, 4, 10, 9, 2, 1, 5]

Posted feedbacks - OCaml


	
1
2
3
4
5
6
#light
let shuffle ls =
    let rnd = new System.Random() in
    List.sort (fun x y-> rnd.Next(-1,2)) ls;;

let bingo n = shuffle [1..n]

気付くと嬉しいアルゴリズム。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
module Array = struct
  include Array
  let bury arr n len =
    Array.blit arr (n+1) arr n (len-(n+1))
    
  let shuffle arr =
    let len = Array.length arr in
    for i = len downto 1 do
      let v = Random.int i in
      let value = arr.(v) in
      bury arr v i;
      Array.set arr (i-1) value;
    done
end;;

let bingo n =
  let res = Array.init n (fun i -> i+1) in
  Array.shuffle res;
  res;;

Index

Feed

Other

Link

Pathtraq

loading...