Random関数で乱数を重複なしで生成し、配列に格納する方法

有名なコードとしてランダムに生成した乱数を重複なしで配列に格納する、というものがあります。
これをVERSEでもやってみたいのですが、JavaScriptなどとは文法が異なるのでプログラミングに手間取っています

自分で一からやり切ろうとすると1つ1つ文法上の問題にあたってしまうことになってしまいそうなので、どなたかもし参考にできるようなテンプレートやサンプルなど手元にお持ちかあるいはご存知であれば教えていただきたいです!
(ちなみに自分がやろうとしているのは、VERSEのrandom関数で乱数を生成し、For文で重複チェックをして配列変数に順番に格納していこうというものです)

JavaScriptで書くとこのようなコードになりますが、VERSEでやろうとするとてこずります

function randomizing(){
   var arr = [];
   numArr = []; 
   for(var i=0; i < 5; i++){
      arr[i]=i+1;
   }

   for(var j = 0, var len = arr.length; j < 5; j++, len--) {
      rndNum = Math.floor(Math.random()*len);
      numArr.push(arr[rndNum]);
      arr[rndNum] = arr[len-1];
   }
}

興味深いお題だと思い、提示いただいたコードをverseにコンバートしてみました。

        var arr :[]int= array{1,2,3,4,5}

        arrLen := arr.Length 

        numArr := for:
            j := 1..arrLen
            len := arrLen - j
            rndNum := GetRandomInt(0, len);
            result := arr[rndNum]
            set arr[rndNum] = arr[len]
        do:
            result

        #output
        for:
            index->result:numArr
        do:
            Print("{index} : {result}")

恐らく元のアルゴリズムと同じ挙動になっているかと思います。
Verseではforの各イテレーションの戻り値を配列として返せるので、これを上手く使うのがコツに感じました。

1 Like

追記です。前に挙げた物は単に配列を同サイズでシャッフルする物になっていました。
乱数を重複無しで生成し、任意サイズの配列に格納する場合のコードの案も挙げておきます。

Randomizing(MaxValue:int, Length:int ):[]int =
    var source :[]int= for:
        index:=1..MaxValue
    do:
        index
    
    numArr := for:
        index := 1..Length
        len := source.Length - index
        rndNum := GetRandomInt(0, len)
        result := source[rndNum]
        set source[rndNum] = source[len]
    do:
        result
    
    return numArr
1 Like

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.