数列の作成

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
drake

数列の作成

#1

投稿記事 by drake » 8年前

(1,3,5,9,20....n)のような 前の数を足し合わせた数よりおおきくなっていくような数列を作りたいのですが
どうしたら良いでしょうか?どのような関数を使うかなやC言語でのどの部分を学ぶべきかやこのプログラミグソースを1度みるべきなど何かアドバイスをお願いします。
アドバイスを受けて一度自分で作ってみるのでよろしくお願いします。

Rittai_3D
記事: 525
登録日時: 11年前

Re: 数列の作成

#2

投稿記事 by Rittai_3D » 8年前

drake さんが書きました:(1,3,5,9,20....n)のような 前の数を足し合わせた数よりおおきくなっていくような数列を作りたいのですが
どうしたら良いでしょうか?
この数列の一般項は分かりますか?
drake さんが書きました:どのような関数を使うかなやC言語でのどの部分を学ぶべきかやこのプログラミグソースを1度みるべきなど何かアドバイスをお願いします。
ピンポイントな関数もサンプルコードも存在しないものだと思ってください。基本的には自分で作るものです。
強いて言うなら数学の勉強をした方がよいと思います。
初心者です

アバター
usao
記事: 1887
登録日時: 11年前

Re: 数列の作成

#3

投稿記事 by usao » 8年前

今現在,何に困っているのでしょう? (←これが無いと答えようがない気がする)

「前の数」というのが「直前までの全て」なのか「直前の2個」とかなのかわかりませんが,いずれにせよ
>前の数を足し合わせた数
というものを計算して,それよりも大きな数を適当に
(「大きい」だけでは候補は無限にあるでしょうから,何かしら適切に)決めればよいだけではないでしょうか.

drake

Re: 数列の作成

#4

投稿記事 by drake » 8年前

https://ja.wikipedia.org/wiki/Merkle-He ... 7%E5%8F%B7
すみませんこのサイトの鍵生成の超増加数列部分を作りたいのですが困ってる状態です。
とりあえず実行するとランダムに(1,3,8.....)や(2,3,10,22....)など実行するたびに違う数列になり前の値より増えていく数列を作っていきたいのですが
それをどうして作っていっていいか分からない状態です。
ご指摘お願いしますm(_ _)m

box
記事: 2002
登録日時: 13年前

Re: 数列の作成

#5

投稿記事 by box » 8年前

drake さんが書きました: (1,3,5,9,20....n)のような 前の数を足し合わせた数よりおおきくなっていくような数列を作りたいのですが
とりあえず実行するとランダムに(1,3,8.....)や(2,3,10,22....)など実行するたびに違う数列になり前の値より増えていく数列を作っていきたいのですが
前の数(どこからどこまで?)を足し合せた数
なのか
前の値
なのか
どちらですか?

自分がやりたいことを日本語で正確に書くことができなければ、
コードに落とし込むことはまず不可能です。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: 数列の作成

#6

投稿記事 by YuO » 8年前

単純に,それまでの要素の総和に1以上の乱数を足せば,毎回異なる超増加列が得られます。
A1 = R
ANi=1N-1Ai + R
ただし,Rは1以上の乱数。

暗号で利用するので,本来乱数はCSPRNGである方が望ましいでしょう。
ただ,単に作ってみたいというだけであれば,まずセキュアではないですが,randで代用してしまってもよいかと。

drake

Re: 数列の作成

#7

投稿記事 by drake » 8年前

(1,3,5,9,25,56,100....)のように最初は1以上から始まり1+3<n 1+3+5<n2のようにその数字の前の数を全て足し合わせた数より多きい数列です。
説明が下手で申し訳ないです。ご指摘お願いします

drake

Re: 数列の作成

#8

投稿記事 by drake » 8年前

誰かアドバイスよろしくお願いします。。。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: 数列の作成

#9

投稿記事 by YuO » 8年前

アドバイスも何も,すでに私が生成方法の一例を書いていますが何か不足でしょうか。

あと,例示されている数列(1,3,5,9,20....n)や(1,3,5,9,25,56,100....)は超増加列ではないのですが,なぜ超増加列を作りたいというのに超増加列ではないものを例示するのでしょうか。
というか,同じ間違いをしているところを見ると,超増加列でないことに気がついていないのでしょうか。

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: 数列の作成

#10

投稿記事 by へにっくす » 8年前

drake さんが書きました:誰かアドバイスよろしくお願いします。。。
「数列」「シグマ(Σ)」は履修されていますか。
高校数学で学ぶはず(高2かな?)ですが。
履修しているのであればYuOさんのレスで、プログラム(C言語)に落とせるはずです。
履修していないのであればその旨書きましょう(Σってなんでしょうか?とかね)。
それとも、C言語でプログラムに落とせないのでしょうか。
C言語で「Hello, World」と出力する簡単なプログラムは組めますか。
組めないのであれば、まずはC言語を学ぶことですね。
組めるのであれば、まずは途中でもいいので、あなたが作成したコードを掲示してください。
written by へにっくす

box
記事: 2002
登録日時: 13年前

Re: 数列の作成

#11

投稿記事 by box » 8年前

drake さんが書きました:誰かアドバイスよろしくお願いします。。。
これをC言語で書き直せばよいでしょう。

コード:

def f(a, n)
  (n - 1).times do
    a << a.inject(:+) + Random.rand(1..5)
  end
  a
end

def p(a)
  a.size.times do |i|
    printf("%d%s", a[i], i == a.size - 1 ? "\n" : ", ")
  end
end

a = [1]
f(a, STDIN.gets.chomp.to_i)
p(a)
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

drake

Re: 数列の作成

#12

投稿記事 by drake » 8年前

たくさんのご指摘ありがとうございます。
数列は自分のうちまちがいです。すいません正しくは(1,3,6,12,33....)などのような感じです。
とりあえずHello worldは作れます。只おっしゃて頂いたΣの計算をC言語どうかけばいいか分からない状態です。
なのでとりあえず超増加数列では単純に1 2 3 4と普通にあがっていく数列を作ったのですがそれもうまくいかない状態のレベルです。
ここからどうアレンジしてばいいのか分からない状態でありrandの出す整数をどう加えるのかなど分からない状態です。ご指摘お願いします。

コード:

 #include<stdio.h>

int main(void)
{
int x;

for(x=1; x<10;x++);{
printf("%d",x);
}

return(0);
}
 

この結果が10だけになります。自分の頭ではxは1からはじまり10以下になるまで1ずつ増えていくと思ってるのですがなぜか数列が作れないです。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 数列の作成

#13

投稿記事 by みけCAT » 8年前

drake さんが書きました:

コード:

 #include<stdio.h>

int main(void)
{
int x;

for(x=1; x<10;x++);{
printf("%d",x);
}

return(0);
}
 

この結果が10だけになります。自分の頭ではxは1からはじまり10以下になるまで1ずつ増えていくと思ってるのですがなぜか数列が作れないです。
xは(最適化されなければ)まず1に初期化され、10以上になるまで(「10以下になるまで」は誤り)1ずつ増えていきます。
そして、最終結果の10がprintfにより出力されます。
増えていく過程を表示するには、for文の行の最後から2文字目のセミコロンが邪魔ですね。

コード:

#include<stdio.h>

int main(void)
{
	int x;

	for(x = 1; x < 10; x++)
	{
		printf("%d\n", x);
	}

	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 数列の作成

#14

投稿記事 by みけCAT » 8年前

drake さんが書きました:只おっしゃて頂いたΣの計算をC言語どうかけばいいか分からない状態です。
普通に書けばいいです。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX 10

int R(void)
{
	return rand() % 10 + 1;
}

int main(void)
{
	int A[MAX + 1];
	int i, N;
	srand((unsigned int)time(NULL));

	/* A1 = R */
	A[1] = R();
	for (N = 2; N <= MAX; N++)
	{
		/* AN = Σ_{i=1}^{N-1}Ai+R */
		A[N] = 0;
		for (i = 1; i <= N - 1; i++) A[N] += A[i];
		A[N] += R();
	}

	/* 生成した数列を出力する */
	printf("%d", A[1]);
	for (i = 2; i <= MAX; i++) printf(",%d", A[i]);
	putchar('\n');

	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 数列の作成

#15

投稿記事 by みけCAT » 8年前

ついでに、配列を使わず計算量も少ないバージョンも置いておきます。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NUM 10

int get_rand(void)
{
	return rand() % 10 + 1;
}

int main(void)
{
	int i, sum;
	srand((unsigned int)time(NULL));

	sum = 0; /* これまでの合計 */
	for (i = 0; i < NUM; i++)
	{
		/* 数列の次の要素を作成する */
		int next_value = sum + get_rand();
		/* 作成した要素を出力する */
		if (i > 0) putchar(',');
		printf("%d", next_value);
		/* 作成した要素をこれまでの合計に加える */
		sum += next_value;
	}

	putchar('\n');
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

drake

Re: 数列の作成

#16

投稿記事 by drake » 8年前

ご回答ありがとうございます!とりあえずこぴぺして実行したら数列を作る事ができました。ただどうしてこうなるのか理解したいのですが
自分で調べて分からない所を教えて頂きたいです。
#define NUM 10

int get_rand(void)
{
return rand() % 10 + 1;
}
自分の見解をかくのでどこの理解が間違っているか教えてほしいです。
#define NUM 10→10個のNUMという変数をいれる場所いれる場所を宣言しているのでしょうか?
return rand() % 10 + 1;→ rand() % 10 + 1は1~10のランダムな乱数を作るだと思うのですがreturnをつけるとどうなるのでしょうか?また1~10の乱数を作るのになぜ実行すると10以上の乱数が足されているのでしょうか?
for (i = 0; i < NUM; i++)→iがNUMより小さいときiは一ずつ増えていくだと思うのですがこの場合はNUMは何でどの部分をさしているのでしょうか?
printf("%d", next_value);と
sum += next_value;→このnext_valueが何を表しているのかわからないです。よくわからないです

説明が分かりにくいと思いますがご指摘お願いします。

アバター
usao
記事: 1887
登録日時: 11年前

Re: 数列の作成

#17

投稿記事 by usao » 8年前

オフトピック
>C言語でのどの部分を学ぶべきか

あくまでもC言語で取り組む必要があるのであれば
(#define NUM 10 って何ですか?
 return って何ですか?
 …というのを場当たり的に解決するのではなくて)
まずはCの文法とかその辺りの基礎をある程度学ばれた方が良いように思います.

hide

Re: 数列の作成

#18

投稿記事 by hide » 8年前

それくらいだと入門書を買ってきて最初のところから理解して、
サンプルコードの部分を塗りつぶしても同じものをかけるようになってください
くらいしか言えないですね。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 数列の作成

#19

投稿記事 by みけCAT » 8年前

drake さんが書きました:#define NUM 10→10個のNUMという変数をいれる場所いれる場所を宣言しているのでしょうか?
いいえ、「ソースコードのここ以降にNUMというトークンがあったら、それを10に置換しろ」という指示をプリプロセッサに出しているだけです。
drake さんが書きました: return rand() % 10 + 1;→ rand() % 10 + 1は1~10のランダムな乱数を作るだと思うのですがreturnをつけるとどうなるのでしょうか?
作られた乱数がこの関数の戻り値となり、この関数の実行を終了して呼び出し元に戻ります。
drake さんが書きました:また1~10の乱数を作るのになぜ実行すると10以上の乱数が足されているのでしょうか?
1~10の乱数を作るからです。10は10以上です。
drake さんが書きました: for (i = 0; i < NUM; i++)→iがNUMより小さいときiは一ずつ増えていくだと思うのですがこの場合はNUMは何でどの部分をさしているのでしょうか?
NUMはマクロで、「どの部分をさしている」というのはよくわからないですがプリプロセッサにより10に置き換えられているはずです。
drake さんが書きました:printf("%d", next_value);と
sum += next_value;→このnext_valueが何を表しているのかわからないです。
next_valueは生成された数列の要素です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

drake

Re: 数列の作成

#20

投稿記事 by drake » 8年前

皆さんたくさんのご指摘ありがとうございました。
皆さんに言われたとおり参考書をもう一度1から読み直し改めて勉強します。
みけCATさんもご丁寧にすべて答えてくださってありがとうございます。とてもわかりやすく自分のなかで理解ができました。
これから頑張っていきたいと思うのでまたアドバイスのほうよろしくお願いします。

閉鎖

“C言語何でも質問掲示板” へ戻る