• ベストアンサー

乱数ってなんですか?

なんどもすいません。配列のはなしなんですが、まずAという配列の中の0~10番目の中身をランダムに動かして、Bという配列に再編成させたいのですが、 乱数を使えば簡単になるよと知り合いにはいわれたのですが、乱数がどうゆうもの だかあまりよくわかりません。 自分は今VC++のMFCで作ってるのですが、乱数自体がわからないので教えてください。 それとこの方法でいくと日本語の時は配列を2個づつランダムに変えることになると思うのですが、それはぜんぜん予想もできません。教えていただけると助かります。お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.4

皆さん、お答えが難しすぎるみたいですね。 「乱数」と言うのは、「サイコロ」を振ると言うのと同じです。 例えば、既に回答の出ている rand関数を実行するとコンピュータがサイコロを振ってその答えを返してくれます。 rand関数の答えは(言語によって違いますが)ここでは0<=n<1と言う事にしておきましょう。 小数点以下10桁で近似すると0.0000000000~0.9999999999と言う事になります。 ここで1~50の乱数が欲しいとします。 このときは INT(乱数*50)+1とすれば(0~49)+1で目的が達成されます。INTは切り捨て(正のときのみ) > すると、呼ぶたびに違う値といってましたが同じ数字が来りはしないのでしょうか? 「サイコロ」ですから同じ数字も来てしまいます。これを防ぐ方法(テクニック)は有ります。3日前の質問の回答を見てください。(下記URL) 同じ悩みを持つ人は多いのです。

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=213544

その他の回答 (3)

  • sssohei
  • ベストアンサー率33% (33/98)
回答No.3

>乱数 規則性のない数列のことです。 現在のコンピュータで「規則性のない数列」を作ることは出来ないので、非常に規則性の少ない(周期の長い)数列を作る方法を用いて、「疑似乱数」と呼ばれる物を利用していますが、通常、それをも含めて乱数と言います。 Cであれば、stdlib.h に含まれる rand 関数などを利用します。 配列の並べ替え等々については過去に質問があると思うので検索してみてください。

回答No.2

乱数というのは0以上1未満で、コンピュータがランダムにはじきだす数値です。 この乱数に特定の数字(例:100)をかけると、 0以上100未満のばらばら不規則な数字を出すことができます。 例えば、ロトくじやナンバーズ予想、パチンコの当り確率などに応用します。

  • inetd
  • ベストアンサー率23% (43/184)
回答No.1

乱数というのは簡単に言うとでたらめな数なんですが、実際にはちゃんと計算したりしないとうまくでたらめになってくれません(計算だけでなくハードウェアの状態を拾ったりしてそれを含めて計算しているのもあります)。で、C言語だと rand() という関数があります。それと乱数計算の種になる値を与えるための srand() という関数があります。(コンパイラ付属のライブラリはこれだけではないと思います。調べてみてください)。 で、要するに rand() 関数は呼ぶたびに違う値を返してくるんです。ライブラリによっても違うかも知れませんがたとえば 0 から 0x7fff の間の値を返してくるようになっていて、その値を利用して 0 から 9 までの範囲にする場合こんな計算をしたりします。 int n = rand() * 10 / 0x8000; 意味わかりますよね? rand()が 0 ~ 0x7fff の内の何れかを返すのであれば上記の計算結果は 0 ~ 9 になります。

channel6
質問者

補足

返事ありがとうございました。内容は半分ぐらいは理解できましたがわからないとこもあるので聞こうとおもいます。 まず、配列での話となるんですが、この書いてもらったやり方で0~9 までの数字をfor文で回して、ひとつづつ新しい配列に添え字を入れていくと すると、呼ぶたびに違う値といってましたが同じ数字が来りはしないのでしょうか?

関連するQ&A

  • 乱数とは・・・?

    質問なんですが、配列の中身が、( AA(10) ) AA(1) = "りんご" AA(2) = "ringo" AA(3) = "みかん" AA(4) = "mikan" …10まで日本語→ローマ字の繰り返し という形で、これを乱数でバラバラにして、AA(1)とAA(2)(同様に3と4)を一塊としてlabel 1,2に時間経過で表示したいのですが、 時間経過で表示は出来たのですが、乱数の使い方がよく分からないのでランダムに表示されません。 もしかしたら、1と2をセットとして表示というのは無理なんでしょうか?

  • 乱数での確率

    乱数に確率をつけることはできるでしょうか? たとえば配列にA、B、Cの3つの要素を収めておいて、  Aが出る確率=50%  Bが出る確率=30%  Cが出る確率=10% といったように確率を設定してランダム表示させたいのですが。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 乱数を配列へ格納(JavaScript)

    乱数を重複しないよう8個配列へ格納したいのですが、 格納の時点でエラーが発生します。 「オブジェクトでサポートされていないメソッドまたはプロパティです」 なぜでしょう? どなたかご教授下さい。 numbers = new Array(); // 空の配列宣言。 function make() { while(numbers.length < 8){ check = true; number = Math.floor(Math.random() * 100);// ランダムに0~99までの整数を取得。 for(i = 0; i < numbers.length; i++) { // 今取得したものと同じ乱数がないか、 if(number == numbers[i]) { // 配列の中身全てと比較。 check = false; } } if(check) { numbers.push(number); // 取得した乱数を配列に格納。 } } }

  • 乱数について

    今、あるデータの順番をばらばらにするプログラムを作ろうとしています。  たとえば、a,b,c,dとあったら、d,b,c,aとするように、この時考えられるプログラムは、データの数だけ配列を用意して、乱数で、どのデータを出力させるかを決定し、出力し終わったら、その配列のところに印を立てて、次にくるデータに対して、2重にならないように順次、出力していく方法が考えられるのですが。。。    膨大なデータをこのように、すると、二重になる確立が出力するたびに、高くなっていって、なかなか終わらなくなってしまいます。  そこで、残ったデータから、ランダムに選び出すアルゴリズムまたは、関数はないでしょうか?よろしくお願いします。

  • 重複しない乱数を作り配列に入れる(AS3.0)

    Flash Pro CS5 AS3.0 で記述しています。 1~10の整数をランダムかつ重複せずに配列に格納したいと考えています。 そこで,ネット上で参考になるソースを見つけ, 以下のように書き直しました。 var int_a = new Array(); var int_b = new Array(); function RandomInt():void{ //ここだけ変更すればよい var maxN:Number = 10;//乱数の最大値 //0~maxNの数字を全部配列に入れる for (var i:int=0; i< maxN; i++) { int_a[i] = i+1; } var j:Number = 0; var a_length:Number = int_a.length; //要は配列をシャッフルする while (a_length) { var int_r:Number = Math.floor(Math.random()*(maxN+1-j)); //乱発生した整数を配列int_bに順番に入れ、int_aから削除する int_b[j] = int_a.splice(int_r, 1); j++; //配列int_a内の数字が一つずつ減っていく a_length = int_a.length; } //ここで配列int_bがシャッフルされた trace(int_b); } RandomInt(); としました。 しかし出力結果がなぜか 8,2,4,9,,7,6,5,10,3,1のように抜けている部分があり, 次のフレームで for(var j:int=1; j <= 10; j++){   trace(int_b[j]); } として確認してもやはり 2 4 9 7 6 5 10 3 1 となってしまします。 どの部分がおかしいのか教えていただきたいです。 また,乱数発生の部分で Math.floor(Math.random()*(maxN+1-j)); という風に記述してあったのですが,ここは間違いではないのでしょうか? jを引いていくと発生する乱数の範囲が徐々に狭くなっていってしまうと思ったのですが; それとも元のソースコードを使って ttp://www.renowan.com/blog/?p=143 0~9までの乱数を発生させてそれぞれに1を足す方が簡単でしょうか? よろしくお願いします。

    • ベストアンサー
    • Flash
  • VC++2010 MFC エディットボックスの質問

    VC++2010 MFC エディットボックスの質問なんですが、 バリュー型変数を使わないでどうやったら配列(char型8byte(unsigned char[8]))の中身すべてをエディットボックスにいれて表示することができますか?よろしくお願いします。配列の中身は文字もあったりします

  • 整数型の配列をランダムに並べ替える方法

    100ます計算の問題を作る、というプログラムを作ってみようと考えています。 問題となる数列は、1から9までの数字をランダムに並べ替えた物になるはずです。 さて、この「ランダムに並べ替えた数字」というのは、どういったアルゴリズムで作成するのが最適なのでしょうか? 個人的に思いついたのは、以下のような方法です。 1.整数型の配列変数(要素が9個)を作成し、それぞれ1から9まで数字を入れておきます。 2.乱数を使って、「x番目とy番目の数字を入れ替え」という風に、何度も入れ替えを行います。 これだと非常に単純なのですが、正直言って素人の考えなので、最適なのかどうか疑問なのです。 もっと最適な方法があれば教えて頂きたいです。

  • 多次元配列への数値の代入。

    こんにちは。 今、多次元配列への数値の代入の仕方で、悩んでいます。 A[][] = new int[n][n]; B[][] = new int[n][n]; 上記のようなn行n列の配列を宣言し、nを入力します。 例えば、n=100と入力すると、100行100列の配列を定義したことになり、Aの配列には1~10000、Bの配列には10001~20000の数値を代入、200×200であれば1~40000、40001~80000…という感じにしたいのですが、いいアイディアが浮かびません。 また、1~nの間でランダムに数値を選び、その数値を代入というのも考えましたが、Javaで乱数を代入できるのかな?という疑問が出来てしまい、わからなくなってしまいました。 何かいい考えがありましたら、ぜひ教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 日本語についての質問

    日本語についての質問 私は日本語を勉強している外国人です。 次の質問があまりわかりませんが、手伝っていただけないでしょうか。 どうも ありがとうございます。 ジャンル()幅広く本を読んでいる。 A.にとどまらず B.を問わず A番でもB番でも、正しいと思いますが。どの番を選ぶべきですか。 それから A番やB番の区別は何ですか。 お願いします。

  • Window2000(英語版)へのソフト移植(VS6.0(日本語版で作成))について

    Window2000(英語版)へソフト移植ついて質問があります。 Window2000(日本語版)-VC++6.0(日本版)を使用して作成したソフト(画面ソフト)をWindow2000(英語版)へ移植する場合,開発環境は,やはりVC++6.0(英語版)で行なわないとNGなのでしょうか? それとも Window2000(日本語版)-VC++6.0(日本版)で言語などを注意(日本語などを使用しないようにするコメントも含めて)して作成すればWindow2000(英語版)へ移植することは可能でしょうか? それ以外にも問題が発生するのでしょうか (MFCのライブラリにも影響がある?) バクゼンとした質問で申し訳ありません だれか御教授ください。