Flashでランダムな値を得たいのですが、

たとえば10から20までと制限したうえで、さらにランダムに正負を付けるにはどうすればよいでしょうか?

-20<x<-10 であり、かつ 10<x<20 といった感じです。
また、端っこの数値は厳密に出す必要はありません。
20や10は出ても良いですし、出なくても結構です。
ですので、細かいことは気にせずにできるだけ短めなものをお願いします。

回答の条件
  • 1人5回まで
  • 登録:2008/04/24 21:16:59
  • 終了:2008/04/24 23:46:30

回答(5件)

id:gday No.1

gday回答回数383ベストアンサー獲得回数712008/04/24 21:35:34

ポイント40pt
rand = Math.random() - 0.5;
if(rand < 0){

		rand = rand * 20 - 10 ;

	} else {

		rand = rand * 20 + 10 ;

	}
id:matsumos

ご解答ありがとうございます。

なるほど、if文を使うのですね。

わかりやすく解答してくださってありがとうございます。

次は、もう少し短い感じになるといいですね。

たとえば、if文を使わない方法ってあるのでしょうか。

2008/04/24 22:03:20
id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332008/04/24 21:49:07

ポイント40pt
x = (Math.random() - 0.5) * 20;
if (r >= 0)  x += 10;
else         x -= 10;

こんな数式でいかがでしょうか。

乱数 x の範囲は

-20 \lt x \lt -10 ,\,\, +10 \le x \lt +20

となります。

id:matsumos

ご回答ありがとうございます。

ifってこんな書き方もあるんですね。

とても勉強になります。ありがとうございます。

早くもかなり短くなってきて、感激です。

ほかの解答もお待ちしております。

2008/04/24 22:07:17
id:GoldenDawn No.3

GoldenDawn回答回数426ベストアンサー獲得回数812008/04/24 22:05:11

ポイント30pt
v = Math.random() * 2 - 1 ;
v = (v + (v > 0 ? 1 : -1)) * 10 ;
id:matsumos

ご回答ありがとうございます。

すごい、二行になるんですね!

これはいつか見た、条件演算子ってやつしょうか?

なるほど、こう使うんですね。

大変勉強になります。

ありがとうございます。

やっぱり皆さんifやif的な物を使われますね。

そうなると、ifを使わない感じのやりかたが、果たして存在するのかも気になります。

2008/04/24 22:19:30
id:GoldenDawn No.4

GoldenDawn回答回数426ベストアンサー獲得回数812008/04/24 22:16:38

ポイント30pt
v = (Math.random() + 1) * (Math.random() > 0.5 ? 1 : -1) * 10 ;

長さはあまり変わらないけど 1行で。

id:matsumos

何度もご回答いただきまして、ありがとうございます。

1行きましたね!やった!

本当にありがとうございます。

ところで、これどうやって使うんでしょうか?

  • 20<x<-10 であり、かつ 10<x<20

という条件でしたが、たとえば

  • 1000<x<-60 であり、かつ 60<x<1000

という感じにしたいとき、数値をどう変更するかです。

よろしくお願いします。

2008/04/24 22:24:42
id:GoldenDawn No.5

GoldenDawn回答回数426ベストアンサー獲得回数812008/04/24 23:34:27

ポイント50pt

条件分岐を使わないやり方

v = Math.random() * 20 - 10 ;
v = v + 10 * v / Math.abs(v) ;

1000<x<-60 であり、かつ 60<x<1000

(↑ -1000 < x < -60 だと思いますが)

正負それぞれの幅の大きさは 1000 - 60 = 940

0~940 の乱数を生成して 60 底上げ

1/2 の確立で正負に分ける

v = ((Math.random() * 940) + 60) * (Math.random() > 0.5 ? 1 : -1) ;
id:matsumos

どうもありがとうございます!

大変よくわかりました。

if文を使わないものまで書いてくださってありがとうございます。

本当に勉強になりました。

この問題について、もう何も思い残すことはありません!

ありがとうございました。

2008/04/24 23:44:40
  • id:gday
    回答5はv=0の時に破綻しますよ。
    http://oshige.com/flash/note/archives/2005/02/post_9.html
    >>
    ■算術演算子
    算術演算子は数値の演算を行います。+-*/は一般的な加減乗除の計算と同じです。/の除算では、0での割り算を行ってもエラーにはならず値はInfinity(正の無限大)または-Infinity(負の無限大)になります。
    <<
  • id:GoldenDawn
    確かに。
    じゃあこれで。
    while(!(v = Math.random() * 20 - 10)){} ;
    v = v + 10 * v / Math.abs(v) ;
  • id:gday
    でも、それだと条件分岐を行っていることになりますよ。
    符号を返してくれる関数が標準であればいいのですけどね。
  • id:GoldenDawn
    ... orz
    v = (Math.random() * 10 + 10) * Math.pow(-1, Math.round(Math.random())+1) ;
  • id:gday
    をー、できましたね。
    こういうのもアリですね。

    v = (Math.random() * 10 + 10) * (Math.round(Math.random())-0.5)*2);


    整理して
    v = (Math.random() * 20 + 20) * (Math.round(Math.random())-0.5);
  • id:matsumos
    切り上げるのが早すぎたようです。どうもすみません。

    いやーでもすごい!こんなやりかたもあるんですね!
    本当に勉強になります。ありがとうございます。
  • id:gday
    ポイントを送って頂いたみたいで恐縮です。ありがとうございます。
    こういうのってパズルを解くみたいで面白いですよね。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません