配列の要素をシャッフルしたい

配列の中身をランダムに変更する関数を作りたいのですが、分からないので教えてください
配列を1周する中で、ランダムに選ばれた配列の要素と該当する配列の要素を1対1で入れ替えることで、ランダムに配列の要素をシャッフル出来ます

処理イメージ ※クリックで拡大します

umiumiさんの掲示板で、直撃の関数をしろまささんが回答していたので、参考とさせて頂き、ご紹介します。

コード例

DIM list[] = 1,2,3,4,5,6,7,8,9,10

shuffle(list)

For num = 0 TO length(list)-1
	PRINT list[num]
NEXT

//---シャッフル関数
Procedure shuffle(var list[])
 Dim n = length(list)	//配列の要素数
 Dim i, r, tmp
 for i = 0 to n -1
  r = random(n)	
  tmp = list[r]		//ランダムに選ばれたr番目の配列の値を取得
  list[r] = list[i]	//配列i番目の値をr番目に入れる
  list[i] = tmp		//入替え完了
 next
Fend
ただし、UWSCのバージョンが4.0以上でないとエラーが出るようなので、注意です

タグ

2013年4月10日 | コメントは受け付けていません。 |

カテゴリー:Q&A

RANDOM

RANDOM関数

数学関数。0 < = X < Range の範囲にある乱数を返す
RANDOM(Range)

引数
・Range・・・0 < = X < Range の範囲にある乱数を返す
戻値
・乱数

ランダムな数字を返す

//0~99の範囲にある乱数を返す
PRINT RANDOM(100)

RANDOM(Range)のRangeという数が出てこないことを確かめる

「0 < = X < Range の範囲にある乱数を返す」ということなので
Rangeの数は出てこないはずです。
10,000回繰り返して
確かめてみましょう。

この投稿の続きを読む »

タグ

2012年6月3日 | コメントは受け付けていません。 |

カテゴリー:関数一覧

ランダムな文字列をメモ帳に書き出したい

ランダムな文字列をメモ帳に書き出したい
IDやパスワードなどを生成する際に、
意味を持たないランダムな組み合わせの文字列にしたい事があります。

テストデータを作ったり、全く想定できないパスワードを作る際に利用します。
一つ、二つ程度ならばガチャガチャとキーボードを叩けば作れますが
何十個も作るとなると、ちょっと大変ですね。
そんな問題をUWSCで解決してみましょう。


8文字のランダムな文字列10個をメモ帳に書き出してみます。

IDPASS = ""
//文字列10個出力
FOR A = 1 TO 10
    //文字数は8文字
    FOR B = 1 TO 8
       IDPASS = IDPASS + RETURNCHAR()
    NEXT
    IDPASS = IDPASS + "<#CR>"
NEXT
SENDSTR(EXEC("NOTEPAD"),IDPASS)

FUNCTION RETURNCHAR()
SELECT RANDOM(26)
CASE 0
RESULT = "a"
CASE 1
RESULT = "b"
CASE 2
RESULT = "c"
CASE 3
RESULT = "d"
CASE 4
RESULT = "e"
CASE 5
RESULT = "f"
CASE 6
RESULT = "g"
CASE 7
RESULT = "h"
CASE 8
RESULT = "i"
CASE 9
RESULT = "j"
CASE 10
RESULT = "k"
CASE 11
RESULT = "l"
CASE 12
RESULT = "m"
CASE 13
RESULT = "n"
CASE 14
RESULT = "o"
CASE 15
RESULT = "p"
CASE 16
RESULT = "q"
CASE 17
RESULT = "r"
CASE 18
RESULT = "s"
CASE 19
RESULT = "t"
CASE 20
RESULT = "u"
CASE 21
RESULT = "v"
CASE 22
RESULT = "w"
CASE 23
RESULT = "x"
CASE 24
RESULT = "y"
CASE 25
RESULT = "z"
default
RESULT = "a"
SELEND
FEND

UWSCのRANDOM関数(0~指定数字未満のどれかを返す)を使って
ランダムな数値を取り出し、その数値をアルファベットに変換します。
それを8文字×10個繰り返すという、
非常にわかりやすいスクリプトです。


これだとちょっと冗長だと思う方はもう少し短くしてみましょう。


文字にはすべてASCIIコードという値が割り当てられています。
そしてUWSCには文字とASCIIコードを変換する関数があります。

UWSCでは「a」のASCIIコード97は、「z」のACIIコードは122となっています。
このACIIコード表を見ればわかるように「a」から「z」まで順番に97から122と数値が割り当てられていますので
この仕組みを利用しましょう。

IDPASS = ""
//文字列10個出力
FOR A = 1 TO 10
    //文字数は8文字
    FOR B = 1 TO 8
       IDPASS = IDPASS + RETURNCHAR()
    NEXT
    IDPASS = IDPASS + "<#CR>"
NEXT
SENDSTR(EXEC("NOTEPAD"),IDPASS)

FUNCTION RETURNCHAR()
RESULT = CHR(97 + RANDOM(26))
FEND

だいぶスッキリしました。

では、もう少し要件が細かくなった場合はどうしましょうか。
例えば、下記に対応するのはどうでしょう。
(1)アルファベットの大文字も利用したい
(2)数字も利用したい
(3)5文字のIDと10文字パスワードをセットで10個出したい
(4)IDの先頭文字に数字は使いたくない

複雑そうに見えますが、1つ1つ組み立てていきましょう。

この投稿の続きを読む »

タグ

2012年3月3日 | コメントは受け付けていません。 |

カテゴリー:Q&A

このページの先頭へ