有名なコードとしてランダムに生成した乱数を重複なしで配列に格納する、というものがあります。
これを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];
}
}
t.tutiya
(t.tutiya)
September 25, 2023, 1:47pm
2
興味深いお題だと思い、提示いただいたコードを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
t.tutiya
(t.tutiya)
September 28, 2023, 1:21am
3
追記です。前に挙げた物は単に配列を同サイズでシャッフルする物になっていました。
乱数を重複無しで生成し、任意サイズの配列に格納する場合のコードの案も挙げておきます。
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
system
(system)
Closed
October 28, 2023, 1:22am
4
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.