• ベストアンサー

乱数生成について

c言語のプログラムで、1と-1をランダムにn個出力するプログラムを書きたいと思っています。どのようにすればいいでしょうか。

noname#70509
noname#70509

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

  • ベストアンサー
回答No.4

標準関数のsrandとrandを使えば擬似乱数を得られます。 randは0からRAND_MAXまでの数を生成しますので、必要な範囲に縮めてあげましょう。(%を使う方法は乱数が偏ります) 1と-1でしたら、こんな方法でも計算できますね。 #include <stdio.h> /* 1か-1をN個表示する */ #include <stdlib.h> #include <time.h> #define nrand(n) (int)((double)n*rand()/RAND_MAX) /* 0以上n未満の整数を返す */ #define N 100 int main(void) {  int i;  srand((unsigned int) time(NULL)); /* 乱数の種 */  for (i=0; i<N; i++) {   printf("%d ",nrand(2)*2-1); /* 0~1の乱数を2倍して1引くと-1か1ができる */  }  return 0; }

その他の回答 (5)

  • usokoku
  • ベストアンサー率29% (744/2561)
回答No.6

JIS (番号忘却)乱数表 解説の所にC言語による擬似乱数の作り方が書いてあります。

回答No.5

訂正。。0以上n未満の整数を返すマクロで、nが出る可能性があります #define nrand(n) (int)((double)n*rand()/(RAND_MAX+1.0))

回答No.3

おはようございます. 標準ライブラリに入っているrand()という関数を使うことで,整数値の乱数を得ることができます. ただし,この関数は専門的には擬似乱数と呼ばれるもので, 「決まった方法である値から次の値を作る」ものです. したがって,初期値を決めないことには延々同じ系列が出力されてしまいます. 初期値の設定はsrand()という関数を使えばできます. 以上でランダムな整数値を得ることができますので,後は, 整数値を何らかの方法で(1,-1)に変換してやれば良いということになります. これは整数値の最上位ビットが0だったら1, そうでなければ-1などとすれば良いでしょう(ビット演算を使ってください). 最下位ビットを使わないのは処理系によってはrand()関数の実装に問題があり, 0と1が交互に出現する恐れがあるためです (専門的には線型合同法とよばれる手法を採用しているとこうなる恐れがあります). ただし,もしもあなたが統計などの目的で数万件以上の乱数を必要としているならば, ここで紹介した方法を使ってはいけません. 擬似乱数という用語で書籍などを調べて,きちんとした一様乱数源を利用してください(メルセンヌ・ツイスタ等).

参考URL:
http://ja.wikipedia.org/wiki/Rand
回答No.2

#include <stdio.h> #include <stdlib.h> #define MAX_LOOP 10 /* 最大表示回数 */ int main(void) {   int i, n;   n = 1 + (rand() % 100);   for(i=0; i<n; i++)   {     if(rand() & 1)     {       printf(" 1\n");     }     else     {       printf("-1\n");     }   }   return 0; }

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

> 1と-1をランダムにn個 0, 1のいずれかを1個出力することはできますか? 0のときは強制的に-1にしてやれば、 -1, 1のいずれかを1個出力できますね。 それをn回繰り返せばよいです。

関連するQ&A

  • 乱数について教えてください!

    私はいまC言語で,1~10までの数字をランダムに10個発生させるプログラムを作っています. 単にランダムに発生させることはできるのですが,そうではなくて,10個の中に同じ数字が出てこないようにしたいのです. その方法についてどなたかご存知の方がおられましたら,ご教授お願い致します.

  • 乱数の生成法

    乱数を生成するようなショートプログラムを知りたいのですが、 どんなものがありますか? C言語でお願いします。

  • 簡単なプログラムなんですが…

    C言語の簡単なプログラムなんですが、私のような初心者には良く分かりません… 出来るだけ詳しく教えていただけるとうれしいです。 下の2つのプログラムの作り方が理解できません。 (1)データ数nとn個のデータを入力して、その平均を求めるプログラム。 (2)(1)のプログラムに合計と標準偏差を計算して出力する機能を追加したプログラム。 C言語に詳しい方お願いします。

  • 完全な乱数を生成する方法

    C言語で乱数を生成するときに、今まで srand(time(NULL)); を使用していたのですが、それだと1秒以内に複数の処理を行った際に、 同一の乱数が生成されてしまいます。 時間にとらわれずに完全にランダムな数字を出現させるにはどのような方法を取るのが簡単なのでしょうか? よろしくお願いします。

  • 乱数について

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

  • 乱数の生成について

    Javaの本を購入し、演習を行いましたが思った以上に理解できませんでした。 例題と演習を記入いたしますので、どなたかご教示くだされば幸いです。 ちなみにですが、本は初心者向けで例題のみで解けるものと思われます。 【例題1】0~9の数値を乱数で生成して表示 import java.util.Random; public class Lesson2to14 { public static void main(String[] args) { Random rand = new Random(); int lucky = rand.nextInt(10); System.out.println("今日のラッキーナンバーは" + lucky + "です。"); } } 【演習1】一桁の正の整数値、一桁の負の整数値、二桁の正の整数値をランダムで生成せよ import java.util.Random; public class Exercise2to7 { public static void main(String[] args) { Random rend = new Random(); int lucky = rend.nextInt(10); System.out.println("一桁の正の整数値を表示します:" + (lucky + 1)); Random rend2 = new Random(); int lucky2 = rend2.nextInt(9); System.out.println("一桁の負の整数値を表示します:" + -lucky2); Random rend3 = new Random(); int lucky3 = rend3.nextInt(90); System.out.println("二桁の正の整数値をランダムに生成します:" + (lucky3 + 10)); } } 演習1に関しては例題からなんとなく理解をしてプログラムを組むことができました。(当たってるかは不明です...) しかし演習2と3については例題1では組めるのか理解できません。 【演習2】キーボードから読み込んだ読み込んだ整数値±5の範囲の整数値をランダムに生成して表示するプログラムを作成せよ。 0~5であればrend.nextInt(6)で簡単にランダム生成できますが、 -5~5の範囲となると例題だけでは何も思いつきませんでした。 【演習3】 -1.0以上1.0未満の実数値をランダムに生成して表示せよ。 上記の場合はnextFloatから生成された数値から-1引けばできると思います。 しかし、例えば-2.0以上10以下など正負の値をランダムで生成する方法が解っていません。 こちらも良かったらご教示お願い致します。

    • ベストアンサー
    • Java
  • C言語 乱数

    C言語 乱数 プログラミングの宿題なのですが、よく分かりません。教えていただける方、よろしくお願いします。 ・表示する文字数の長さは12とする。 ・表示する文字は毎回ランダムで表示すること。 ・文字は英字のうち、小文字のみとする。 ・プログラムにrandom()を使うこと。 ・プログラムにsrandom()を使うこと。 よろしくお願いします。

  • (初心者)乱数のことで

    使っているソフトはVisual c++です C言語で乱数を使うときにrandom関数を使ったんですが 帰ってくる値が一定なのでネットで検索したら 「メルセンヌ・ツイスタ」 を進めているサイトが多かったので ヘッダーファイルをダウンロードしてみたのですが メルセンヌ・ツイスタを プログラムに組み込む時どのように記述すればいいのか いろいろ試したのですがわかりませんでした メルセンヌ・ツイスタを組み込む構文の仕方を教えてください

  • 至急で、C言語の問題で解答解説お願いします。

    1実数を3つ(a,b,c)を読み込み3辺とする三角形ができるか判定(d(d-a)(d-b)(d-c)>0のとき三角形となる)しできなければ、三角形ではありません!というメッセージを表示し、できる場合は以下のヘロンの公式を用いて三角形の面積を求めるプログラムをC言語で答えてください。d=(a+b+c)/2 s=√{d(d-a)(d-b)(d-c) 2maxの整数値(≧1)をキーボードから入力し、その値に対応した図形を出力するプログラムをC言語で答えてください。 例 max1 max2 max3 * ** *** * ** *** * ** *** ** *** *** 3整数nをキーボード入力しnの値に応じて以下の図形を表示するプログラムをc言語で答えてください。 n=3 n=4 n=5 3 4 5 45 56 67 678 789 890 0123 1234 56789 4整数n(≧0)を入力し歯科の計算を実行するC言語プログラムを答えてください。2つの自然数nとmを読み込みn個の中からm個を取り出すときの組み合わせの数を計算せよ。ただし、n!を計算する関数long fact (int n)を定義し必ずそれを用いること。 5 1つのscanfで2つの10進数を入力し8進数と16進数で表示するプログラムをC言語で答えてください。 6 実数aを入力し少数第1位で四捨五入する関数g(a)をマクロ定義で入力した値の少数第1位を四捨五入して出力するプログラムをC言語で答えてください。 7 4つの実数w,x,y,zを読み込みその最大値を出力するプログラムをC言語で答えてください。ただし、2つの実数の大きいほうを求める関数 double my may (double x,double y)を定義し、その関数を用い、if文を用いないでc言語で答えてください。

  • 乱数発生関数randomなど

    random, srandom, initstate, setstate で乱数を生成できることを知りましたが、運用方法がよくわかりません。c言語に詳しい方、for文を使って乱数を5個ほど表示させるプログラムを示してください。

専門家に質問してみよう