HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0909
hytrnd25解決


hyt

リンク

2011/9/9(Fri) 19:06:52|NO.41274

言葉でわかりにくいから例
rnd2(6)関数実行
すると5がでてきた
5を記憶
rnd2(6)関数実行
すると2がでてきた
2を記憶
rnd2(6)関数実行
rnd関数で5が出てきた
5は既に出たのでもう一回rndする

という関数を作ってほしいです



この記事に返信する


check

リンク

2011/9/9(Fri) 19:14:22|NO.41275

そうですか、いやです。



というのもなんなので作り方だけ示しておく。

まず、普通のrandで値を取得する。
それを配列の添え字として使い、値が0なら1にし、その値を返す。
もし配列の値が1ならもう一度randをおこなう。

これの繰り返しでいけるはず。



ORZ

リンク

2011/9/9(Fri) 19:24:48|NO.41277

毎回rndするより、予めランダムに数字を用意しておいて、呼ばれる度に一個ずつ出していったらどうだ。
違う引数が渡されたら、数字を用意するところからやりなおす。



check

リンク

2011/9/9(Fri) 20:12:11|NO.41278

前言撤回してスクリプトを貼るわ。

#module #deffunc InitRnd2 int max dim buf, max return #defcfunc rnd2 int max *random tmp = rnd(max) if buf(tmp) == 0 { buf(tmp) = 1 return tmp } else : await 1 : goto *random #global randomize InitRnd2 20 repeat 20 mes rnd2(20) loop mes "終了。"

どれくらいの時間がかかるのか実験したくてな。
とりあえず、このアルゴリズムでは使い物にならないことが分かると思うが、
これは氏の言うとおりプログラミングしたんで、
このスピードを改善するためにはアルゴリズムから変える必要があるが、
それくらい自分で調べて、試行錯誤しながらプログラミングしてみるといい。



hyt

リンク

2011/9/9(Fri) 20:41:39|NO.41279

checkさん、ORZさん、ありがとうございます。



木村

リンク

2011/9/28(Wed) 07:53:27|NO.41790

 解決済みながらもレスポンスを。

 恐らくhytさんの求めているものは乱数というよりシャッフルではないのでしょうか。開発wikiにシャッフルのアルゴリズムがあります。
http://hspdev-wiki.net/?Module%2F%C7%DB%CE%F3%CD%D7%C1%C7%A4%CE%A5%B7%A5%E3%A5%C3%A5%D5%A5%EB

 間違っていたらごめんなさい。



ONION software Copyright 1997-2021(c) All rights reserved.