質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

6回答

896閲覧

C言語 乱数 和を定数にする

syogak

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2021/10/21 19:18

乱数を用いるのに、その出力したものの和を固定値にさせたいです。

下のコードで言うと、
2 10
と入力すると
XXXX
XXXXXX
(和はbの大きさ、行列の行数はaの大きさ)に出力されるようなプログラムを書きたいです。
以下のままでは、和が全く無視された状態で出力されてしまうので、どのように加筆・改善すれば良いかをお尋ねしたいです。乱数は必ず使いたいです。
自分なりにも考えましたが、思い浮かびませんでした。

C

1#include<stdio.h> 2#include<stdlib.h> 3#include<time.h> 4#define MAX1 10 5#define MAX2 50 6 7int main(){ 8 9 char yama[MAX1][MAX2]; 10 int a, b, i, j; 11 srand((unsigned)time(NULL)); 12 13 printf("How many stacks and coins?\n"); 14 scanf("%d %d", &a, &b); 15 for(i = 0;i < a;i++){ 16 for(j = 0;j < rand() % (b - 1) + 2;j++){ 17 yama[i][j] = 'X'; 18 } 19 yama[i][j + 1] ='\0'; 20 } 21 for(i = 0;i < a;i++){ 22 printf("%s\n", yama[i]); 23 } 24 }

自分で調べ、引き算を使えばうまくいくのかも、と思いましたが、やり方もわからず断念しました。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/10/21 21:21

ちと言ってることがわかりません。 具体的に、何をどうしたらどうなってほしいのか、詳しく説明しよう
guest

回答6

0

乱数を用いるのに、その出力したものの和を固定値にさせたい

それを「乱数」とは呼ばないと思いますが。

0~a-1の値を乱数でb回発生させてそのヒストグラムを取ればよいのでは?

[追記]
データ0個の要素を作りたくないなら、最初に「1個ずつ配っておく」必要があるか。
(a>bであったらどうするか、なんていうのは私の知ったことではないです)

とっても課題臭があるからまんまのサンプルを示したくないんだよなぁ...

投稿2021/10/21 22:05

編集2021/10/21 23:27
thkana

総合スコア7659

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/10/22 01:57

> 0~a-1の値を乱数でb回発生させてそのヒストグラムを取れば bがでかい値になり得るとしたら「b回」がちょと嫌かも? → 毎回binに配る値も 1~残り の乱数で決めるとかしてもよいかも(依然として,最悪の場合はb回だけど^^)
fana

2021/10/22 02:06

ところで,この方法は結果に結構な偏りがありますよね: 当分配的な結果は出やすく,極端な分配の結果は出にくい. (まぁ,そもそも「偏るな」とは言われていないので,どうでもいいのかもしれない)
guest

0

現在のコードでは、
3,10
という入力に対して
XXXXXXX
XXXXXXXX
XX
のような出力が場合があります。
これは単純な引き算ではどうしようもありません。

求める答えを出したければ、a個の乱数を得てからbをその割合で配分するようにしましょう。
整数計算をすると切り捨てすることになりますので、合計はbになるとは限りませんので最後の数で調整しましょう。このときは引き算を使います。

そうやって各行の個数が決まった後に出力することになります。
Xを繰り返し出力するだけなので、格納する配列は必ずしも必要ないですよ。

投稿2021/10/21 21:52

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/10/22 01:46

a次元ベクトルをてきとーに乱数で用意して,L1ノルムがbになるように伸縮するだけの話ですね. 全要素値を整数に丸めたらL1ノルムがちょっと減るので,後処理でその分をてきとーに配る,と. (「いずれの要素も0にならないこと」という暗黙の条件がありそうにも思えるので, 上記の話で L1ノルムが (b-a) になるベクトルを作った後で各要素に1足せばいいかな?)
fana

2021/10/22 04:08

> 全要素値を整数に丸めたらL1ノルムがちょっと減るので,後処理でその分をてきとーに配る,と. ボケてた.こんなことする必要全然ないな. ノルムをbにした時点で全てが終わっているのに.
guest

0

やりたいのはこういう事でしょうか?
数値を無作為に分配するアルゴリズム

投稿2021/10/23 13:21

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ちょっと問題を把握できていないかもしれませんが、コイン数=長さの棒を乱数で選んだ位置で箱の数-1回だけ切る、と考えればよいのではないでしょうか。
コイン数(切る位置)は整数でも実数でもよいです。
0個になる箱を避けたいのであれば、最初に各箱に配分すべき数だけコイン数を減らして、最後に各箱に足せばよいです。

以下、Pythonでのコード例です。工夫の余地はありますが。

Python

1n_stack, n_coin = 2, 10 2 3vals = sorted([random.randint(0,n_coin) for _ in range(n_stack-1)]) 4print(vals) 5 6ret = [] 7prev = 0 8for val in vals: 9 ret.append(val-prev) 10 prev = val 11ret.append(n_coin-prev) 12print(ret) 13 14print(sum(ret) == n_coin)

投稿2021/10/22 03:58

can110

総合スコア38278

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まあいろんなやり方があるよね

C

1#include<stdio.h> 2#include<stdlib.h> 3#include<time.h> 4#define MAX1 10 5#define MAX2 50 6 7int main(){ 8 9 char yama[(MAX1 * MAX2)+MAX1] = {0}; // 1次元配列で書く 10 int a, b, rNum, i, j; 11 srand((unsigned)time(NULL)); 12 13 printf("How many stacks and coins?\n"); 14 scanf("%d %d", &a, &b); 15 16 // a, b がMAXを超えていないことを確認するのが望ましい 17 18 for (j=0; j<b+(a-1); j++) // b枚にa-1枚を加えたコインを用意する。 19 { 20 yama[j] = 'X'; 21 } 22 23 i=0; 24 while (i<a-1) // 不要なコインを区切り'\n'にする 25 { 26 yama のランダムな位置に'\n'を入れる。 27 そのランダムな位置が 280でない 29 ② 前後が'X'であること 30 を満たすときのみ'\n'を入れる 31 そうでない場合はcontinueする 32 33 i++; 34 } 35 36 printf("%s\n", yama); 37 38 return 0; 39}

投稿2021/10/22 01:05

編集2021/10/22 05:05
WoodenHamlet

総合スコア306

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

いまいちやりたいことがわかってませんが、

乱数の和を固定値にしたい、というのであれば、
b = 固定値;
a = 乱数;
c = b - a;
にすればどうでしょう

投稿2021/10/21 21:39

y_waiwai

総合スコア87800

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問