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

このQ&Aに関連する最新のQ&A

A 回答 (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
    • good
    • 0

>乱数


規則性のない数列のことです。
現在のコンピュータで「規則性のない数列」を作ることは出来ないので、非常に規則性の少ない(周期の長い)数列を作る方法を用いて、「疑似乱数」と呼ばれる物を利用していますが、通常、それをも含めて乱数と言います。

Cであれば、stdlib.h に含まれる rand 関数などを利用します。

配列の並べ替え等々については過去に質問があると思うので検索してみてください。
    • good
    • 0

乱数というのは0以上1未満で、コンピュータがランダムにはじきだす数値です。


この乱数に特定の数字(例:100)をかけると、
0以上100未満のばらばら不規則な数字を出すことができます。

例えば、ロトくじやナンバーズ予想、パチンコの当り確率などに応用します。
    • good
    • 0

乱数というのは簡単に言うとでたらめな数なんですが、実際にはちゃんと計算したりしないとうまくでたらめになってくれません(計算だけでなくハードウェアの状態を拾ったりしてそれを含めて計算しているのもあります)。

で、C言語だと rand() という関数があります。それと乱数計算の種になる値を与えるための srand() という関数があります。(コンパイラ付属のライブラリはこれだけではないと思います。調べてみてください)。

で、要するに rand() 関数は呼ぶたびに違う値を返してくるんです。ライブラリによっても違うかも知れませんがたとえば 0 から 0x7fff の間の値を返してくるようになっていて、その値を利用して 0 から 9 までの範囲にする場合こんな計算をしたりします。

int n = rand() * 10 / 0x8000;

意味わかりますよね? rand()が 0 ~ 0x7fff の内の何れかを返すのであれば上記の計算結果は 0 ~ 9 になります。

この回答への補足

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

補足日時:2002/02/10 02:33
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q乱数と配列

0から99までの整数の乱数を1000個発生させ,各整数の確率(出現確率=出現回数/1000)を計算し、エントロピーを求め表示するプログラムを作成したいのですが、どういったソースコードになるのか教えていただけませんか。

Aベストアンサー

とりあえず書いてみました。
U+3000→U+0009 or U+0020をやらないとコンパイルを通らないと思いますが。
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <functional>
#include <iostream>
#include <numeric>

const int MAX_VALUE = 99;
const int TRY_COUNT = 1000;

struct calc_entropy : std::unary_function<int, double>
{
 double operator() (int count) const
 {
  double p = (double)count / TRY_COUNT;
  return -p * std::log(p) / std::log(2.0);
 }
};

int main (void)
{
 std::srand(static_cast<unsigned int>(std::time(0)));

 int count[MAX_VALUE + 1] = { 0 };

 for (int i = 0; i < TRY_COUNT; ++i) {
  ++count[std::rand() % (MAX_VALUE + 1)];
 }

 double entropies[MAX_VALUE + 1];
 std::transform(count + 0, count + MAX_VALUE, entropies + 0, calc_entropy());
 std::cout << "Entropy : " << std::accumulate(entropies + 0, entropies + MAX_VALUE, 0.0) << std::endl;

 return 0;
}

とりあえず書いてみました。
U+3000→U+0009 or U+0020をやらないとコンパイルを通らないと思いますが。
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <functional>
#include <iostream>
#include <numeric>

const int MAX_VALUE = 99;
const int TRY_COUNT = 1000;

struct calc_entropy : std::unary_function<int, double>
{
 double operator() (int count) const
 {
  double p = (double)count / TRY_COUNT;
  return -p * std::log(p) / ...続きを読む

Q配列と乱数を使ったプログラム

配列と乱数を使ったプログラムについて
今年からプログラミングについて勉強する事になったのですが、

配列と乱数を上手く使うことができません。やりたいと思っていることが

おみくじのプログラムで 大吉 中吉 小吉 という3つの配列からウィンドウ上にランダムで

一つ表示するというプログラムです。 【おみくじの結果は *** です。】 ←***の部分がランダムに配列から表示される結果です。(分かりづらなかったら、ごめんなさい)

病欠で2週ほど授業に出席する事が出来なかったので、配列と乱数についてよく分かりません。

PENというソフトで学習しているので、出来るならPENにそって教えてもらえると、嬉しいです。

宜しくお願いしますm(_ _)m

Aベストアンサー

PENとやらの言語仕様書はたったの8ページ。
わからんもなにもないんじゃないかと。
# で、なんでCのカテゴリで質問するかな?

Q大きな数の乱数を作るには

C 初心者です。
表題のように、unsigned longのスケールの乱数をつくりたいんですが、以下のように記述すると値がいつも同じになります。この理由と、正しく動作するにはどう直したらいいのか教えてください。

unsigned long ul;

ul = 4294967295UL * rand() / (RAND_MAX + 1);

値は常に131071でした。

Aベストアンサー

 No.2の方が書かれているとおり、最初の積算で unsigned intの扱える値の範囲を超えて(オーバーフロー)しまっているものと思われます。

 除算を先にすれば一応解決するはずです。

ul = (unsigned long)(4294967295.l * (rand() / (double)(RAND_MAX + 1)));


 ただ、環境にも依りますが rand()の精度が問題になりそうです。
 RAND_MAXが 4294967295ならば問題はありませんが、それよりも小さな値の場合、0~4294967295の値の中の分解能が低くなるので、同じ値が出る確率が 1/4294967295よりも大きくなります。
(うちの VC7.1は RAND_MAXが 32767だったので、同じ値が出る可能性は 1/32767です)
 その確率を 1/4294967295にしたい場合は、例えば下記のように少し工夫が必要です。

 int d = ULONG_MAX / RAND_MAX;
 int m = ULONG_MAX % RAND_MAX + 1;
 unsigned long ul = rand() * d + rand() % m;

 No.2の方が書かれているとおり、最初の積算で unsigned intの扱える値の範囲を超えて(オーバーフロー)しまっているものと思われます。

 除算を先にすれば一応解決するはずです。

ul = (unsigned long)(4294967295.l * (rand() / (double)(RAND_MAX + 1)));


 ただ、環境にも依りますが rand()の精度が問題になりそうです。
 RAND_MAXが 4294967295ならば問題はありませんが、それよりも小さな値の場合、0~4294967295の値の中の分解能が低くなるので、同じ値が出る確率が 1/4294967295よりも大...続きを読む

Q「MFCを使用しない」から「MFCのスタティックライブラリを使用」

VC++初心者ですが、

Win32Applicationで「MFCを使用しない」で作成したプログラムが正常動作しました。 そこで
「MFCを使用しない」から「MFCのスタティックライブラリを使用」にしてビルドしたところ、リンク中に
どんどんエラーがでます。 関数関係のエラーなのですが。

(1) どうすればエラーを無くせるのでしょうか
(2) 「MFCのスタティックライブラリを使用」にするとどの様なメリットがあるのか(説明している参考URLなど)。

教えて下さい

Aベストアンサー

>(1) どうすればエラーを無くせるのでしょうか

プロジェクトを作り直すのが手っ取り早いです。ソースを修正したり、プロジェクトのリンク対処のライブラリを変更したりすれば何とかできることはできますがおすすめしません。

作り直したプロジェクトに、自分が追加ソースをコピペしていけばちゃんと動くと思います。(ウィザードが自動で追加した分も含む)

>(2) 「MFCのスタティックライブラリを使用」にするとどの様なメリットがあるのか(説明している参考URLなど)。

簡単に書くと、

メリット
・使用しない
実行ファイルサイズが小さくなる。

・使用する
実行するときにMFCのランタイムDLLが不要になる。


デメリット
・使用しない
MFCのDLLに依存するので、DLLのバージョンの違いで動作に不具合が出る可能性がある。

・使用する
実行ファイルのサイズが馬鹿でかくなる。

Q配列のポインタ配列のポインタから元の配列を参照する方法について

C初心者です。下記の様に配列のポインタ配列を作って、そのポインタ配列のポインタを返すコードを書いて、main関数で元の配列の値を参照したいのですが、上手く参照できずに困っています。下記のコードの問題点も含めて、配列のポインタ配列のポインタから、元の配列の値を参照する方法を教えてください。お願い致します。

short int *motion_data(void)
{
short int data1[5][7] = {
{2377,2174,0,0,0,0,0},
{2377,2377,2784,2648,2648,2648,2377},
{2377,2377,2784,2648,2648,2648,2377},
{2377,2377,2377,2377,2377,0,0},
{2377,2377,2377,2377,2377,0,0},
};
short int data2[5][7] = {
{2377,2174,0,0,0,0,0},
{2377,2377,2919,2784,2784,2784,2377},
{2377,2377,2919,2784,2784,2784,2377},
{2377,2377,2377,2377,2377,0,0},
{2377,2377,2377,2377,2377,0,0},
};

short int *po_data[2];

po_data[0] = data1[0];
po_data[1] = data2[0];

return *po_data;
}

C初心者です。下記の様に配列のポインタ配列を作って、そのポインタ配列のポインタを返すコードを書いて、main関数で元の配列の値を参照したいのですが、上手く参照できずに困っています。下記のコードの問題点も含めて、配列のポインタ配列のポインタから、元の配列の値を参照する方法を教えてください。お願い致します。

short int *motion_data(void)
{
short int data1[5][7] = {
{2377,2174,0,0,0,0,0},
{2377,2377,2784,2648,2648,2648,2377},
{2377,2377,2784,2648,2648,2648,2377},
{2377,2377,2...続きを読む

Aベストアンサー

>元の配列の値を参照する方法を教えてください。

 下のようにすると「元の配列の値を参照」できました。
  (BorlandC++5.5.1)

 No.3 さんの言われるように、
 
>関数を抜けると変数自体無くなってしまいます

 「中身自体」は、その番地をいじくらない限り、「ずっと」残っていてくれればいいんだけど・・。
 やっぱ、static かな。

#include <stdio.h>

short **motion_data( void )
{
 short data1[ 5 ][ 7 ] = {
  { 100, 101, 102, 103, 104, 105, 106 },
  { 110, 111, 112, 113, 114, 115, 116 },
  { 120, 121, 122, 123, 124, 125, 126 },
  { 130, 131, 132, 133, 134, 135, 136 },
  { 140, 141, 142, 143, 144, 145, 146 }
 };
 short data2[ 5 ][ 7 ] = {
  { 200, 201, 202, 203, 204, 205, 206 },
  { 210, 211, 212, 213, 214, 215, 216 },
  { 220, 221, 222, 223, 224, 225, 226 },
  { 230, 231, 232, 233, 234, 235, 236 },
  { 240, 241, 242, 243, 244, 245, 246 }
 };
 short *po_data[ 2 ];

 po_data[ 0 ] = &data1[ 0 ][ 0 ]; // もち = data1[ 0 ]; でも
 po_data[ 1 ] = &data2[ 0 ][ 0 ];

 return( &po_data[ 0 ] );
}
void main( void )
{
 short **po_data, *p1, *p2;

 po_data = motion_data();

 p1 = po_data[ 0 ] + 13; // 任意の「元の配列の値を参照」
 p2 = po_data[ 1 ] + 34; //   〃

 printf( "%d\n", *p1 );
 printf( "%d\n", *p2 );
}
注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

>元の配列の値を参照する方法を教えてください。

 下のようにすると「元の配列の値を参照」できました。
  (BorlandC++5.5.1)

 No.3 さんの言われるように、
 
>関数を抜けると変数自体無くなってしまいます

 「中身自体」は、その番地をいじくらない限り、「ずっと」残っていてくれればいいんだけど・・。
 やっぱ、static かな。

#include <stdio.h>

short **motion_data( void )
{
 short data1[ 5 ][ 7 ] = {
  { 100, 101, 102, 103, 104, 105, 106 },
  { 110, 111,...続きを読む


人気Q&Aランキング

おすすめ情報