ページ 11

数列の作成

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

Re: 数列の作成

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

Re: 数列の作成

Posted: 2015年10月08日(木) 14:45
by usao
今現在,何に困っているのでしょう? (←これが無いと答えようがない気がする)

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

Re: 数列の作成

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

Re: 数列の作成

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

自分がやりたいことを日本語で正確に書くことができなければ、
コードに落とし込むことはまず不可能です。

Re: 数列の作成

Posted: 2015年10月09日(金) 03:00
by YuO
単純に,それまでの要素の総和に1以上の乱数を足せば,毎回異なる超増加列が得られます。
A1 = R
ANi=1N-1Ai + R
ただし,Rは1以上の乱数。

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

Re: 数列の作成

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

Re: 数列の作成

Posted: 2015年10月11日(日) 18:21
by drake
誰かアドバイスよろしくお願いします。。。

Re: 数列の作成

Posted: 2015年10月11日(日) 23:41
by YuO
アドバイスも何も,すでに私が生成方法の一例を書いていますが何か不足でしょうか。

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

Re: 数列の作成

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

Re: 数列の作成

Posted: 2015年10月12日(月) 10:46
by box
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)

Re: 数列の作成

Posted: 2015年10月12日(月) 21:56
by drake
たくさんのご指摘ありがとうございます。
数列は自分のうちまちがいです。すいません正しくは(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ずつ増えていくと思ってるのですがなぜか数列が作れないです。

Re: 数列の作成

Posted: 2015年10月12日(月) 22:02
by みけCAT
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;
}

Re: 数列の作成

Posted: 2015年10月12日(月) 22:09
by みけCAT
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;
}

Re: 数列の作成

Posted: 2015年10月12日(月) 22:15
by みけCAT
ついでに、配列を使わず計算量も少ないバージョンも置いておきます。

コード:

#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;
}

Re: 数列の作成

Posted: 2015年10月14日(水) 13:27
by drake
ご回答ありがとうございます!とりあえずこぴぺして実行したら数列を作る事ができました。ただどうしてこうなるのか理解したいのですが
自分で調べて分からない所を教えて頂きたいです。
#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が何を表しているのかわからないです。よくわからないです

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

Re: 数列の作成

Posted: 2015年10月14日(水) 15:11
by usao
オフトピック
>C言語でのどの部分を学ぶべきか

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

Re: 数列の作成

Posted: 2015年10月14日(水) 21:00
by hide
それくらいだと入門書を買ってきて最初のところから理解して、
サンプルコードの部分を塗りつぶしても同じものをかけるようになってください
くらいしか言えないですね。

Re: 数列の作成

Posted: 2015年10月14日(水) 21:50
by みけCAT
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は生成された数列の要素です。

Re: 数列の作成

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