5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

***すれ立てるまでもない質問はここで 第53刷***

1 :デフォルトの名無しさん:04/04/05 22:15
前スレ
***すれ立てるまでもない質問はここで 第52刷***
http://pc5.2ch.net/test/read.cgi/tech/1078325423/


952 :デフォルトの名無しさん:04/05/09 18:54
>950 ちったぁぐぐれ
(最近はぐるぐる?)

953 :デフォルトの名無しさん:04/05/09 19:02
ククリが良い感じ。

954 :デフォルトの名無しさん:04/05/09 19:25
gccってconio.h入ってないんですか?
知ってる人教えてください。

955 :デフォルトの名無しさん:04/05/09 19:26
入ってない

956 :デフォルトの名無しさん:04/05/09 19:27
>>954
getche、getchはあきらめろ。と。

957 :955:04/05/09 19:29
ありがとうございます。

958 :954:04/05/09 19:30
↑間違えた。
>>955 >>956
ありがとうございます。

959 :1:04/05/09 20:02
↑また間違えた。
本当にありがとうございます。


960 :デフォルトの名無しさん:04/05/09 20:12
べき乗計算なんですけど、
66^77 ≡ 19 mod 119  (66^77は66の77乗の意)

であることを確かめるために、perlで

#!/usr/bin/perl
$C = 66;
$C = $C**77;
$C = $C % 119;
print " C is $C\n";

としたんですが、結果が17になってるんです。
正しく計算するにはどうすればいいでしょうか?

961 :デフォルトの名無しさん:04/05/09 20:13
>>960
正解なのでもう一つの計算を疑う。

962 :デフォルトの名無しさん:04/05/09 20:15
もう一つの計算?

・・・・っていいますと?

963 :デフォルトの名無しさん:04/05/09 20:22
>>960
Perl の ** 使って 66^77 なんて計算できない。

(a * b) mod 119 = (a mod 119) * (b mod 119)
だから、
$C = $C * 66;
$C = $C % 119;
を77回繰り返せ。

964 :デフォルトの名無しさん:04/05/09 20:41
>Perl の ** 使って 66^77 なんて計算できない。
やっぱそーですよね・・・。ありがとうございます。

ついでなのでお聞きしたいのですが、
これをC言語で計算しようとすると変数はどう定義すればいいのでしょう?
まず、66^77 = ((66^19)^4) * 66 と置けますよね?
unsigned long int (32ビットの場合) ですでに4294967295までしか
計算できないと思うのですが、66^19の時点で1929904128になり、
(66^19)^4なので1929904128をさらに4乗しないといけません。
unsigned long int よりも大きい整数を計算するための変数の
定義はないのですか?やはり、上のように分割で計算しないとだめ
なんでしょうかね。
すいません、実はC言語に関してはまだやり始めたレベルなので許してください。


965 :ヽ(´ー`)ノ ◆.ogCuANUcE :04/05/09 21:20
>>963
bigint。

perl -Mbigint -e 'print (66 ** 77), "\n"'

この辺の数字になると、もう意味が分からんな。

966 :デフォルトの名無しさん:04/05/09 21:24
>>964
平方乗法使ったら?

967 :デフォルトの名無しさん:04/05/09 22:12
>>964
> これをC言語で計算しようとすると変数はどう定義すればいいのでしょう?
C 言語が直接サポートしているような int, long といった組み込み型で扱える
範囲を超えているので、複数の組み込み型を組み合わせてひとつの数を
表すようにして計算を行う。

既存のライブラリだと GNU MP とか使える。

968 :964:04/05/09 22:43
>>966 967
わかりましたありがとうございます。


969 :デフォルトの名無しさん:04/05/10 02:26
乱数のダブリをなくしたいのですがその方法がわかりません。
プログラムは20個の配列が毎回ダブリのない10個の乱数によってどのように埋まるのかを
検証するために作っています。
(最終的には551個の配列を検証するつもりです)

もともとは

for(i=0; i<arrayLen; i++)
*(randArray + i) = rand() % MAX;

とやっていました。
ダブるので下記のように変えましたがまだダブります。

#define MAX20

int arrayLen = 10, i, j, ransuu;

for(i=0; i<arrayLen; i++) {
ransuu = rand() % MAX;
for(j=0; j<i; j++)
if(ransuu == *(randArray + j)) {
ransuu = rand() % MAX;
break;
}
*(randArray + i) = ransuu;
}

やっていることは
「乱数を発生させてそれが今まで発生させた乱数と同じのがあれば新たな乱数を発生させる」
ということだけです。
当然、その新たな乱数が今まで発生させた乱数と同じであれば元の木阿弥です。
どうすればよいのでしょうか?

970 :デフォルトの名無しさん:04/05/10 02:38
ワシなら配列におさめているもの以外の乱数を返す関数を書く

971 :デフォルトの名無しさん:04/05/10 02:50
質問の答えとは関係ないことなんだけど、
rand() % MAX; ってやると擬似乱数が短い周期持っちゃってランダム性悪くなるからやめた方がいいよ。
(rand()の下位 n ビットは 2^n 周期しかない。)

rand() / (RND_MAX + 1.0) * MAX
ってやるか、せめて
(rand() >> N) % MAX (N は適当な整数)


972 :デフォルトの名無しさん:04/05/10 02:53
http://www.sun-inet.or.jp/~yaneurao/rsp/rspC9toCF.html
ここの 第CC回目

973 :デフォルトの名無しさん:04/05/10 03:05
>>969
ダブリを見つけたら、新たに乱数を発生させて(ここまではできてるな)
ダブリがないかもう一度頭からチェックしないといかん(ここが出来ていない)な。

大ヒント j=0; と continue;

974 :デフォルトの名無しさん:04/05/10 03:37
>>969
配列の中身を並び替えて、ダブらない乱数を発生させる。

975 :デフォルトの名無しさん:04/05/10 04:13
実はかなり混乱しております。

>>970

実はそのアルゴリズムが分からないんですよね(^^ゞ

>>971

そうなんですか! 知りませんでした。

const double RND_MAX = 32767.0;
doubleransuu; //後でcastします

ransuu = rand() / RND_MAX * 10.0; //今回は0も欲しいので"+ 1.0"は省きました。

に変更しました。
ちなみにこれってintでやってはいけないんでしょうか?

>>972

読んでみました。
これが>>974さんの仰っていることですね。

>>972さんの方法と>>973さんの方法のどちらを採るかで迷っています。
どちらでもできると思うのですが、
973さんの方法は僕が最初にやろうとしていた方法を解決策だと思いますので
まずは973さんの方法でやってみたいです。

976 :969 = 975:04/05/10 04:13
大ヒントを基に実際に試してみたのですが、まだ正しく動きません。
頭の中ではこれでいいと思っているのですが(下記参照)。

MAXを10にしてみましたので正しく動くならば
たったの一回で埋め尽くしてしまうはずなのですが
14回〜286回くらいかかります。
乱数の設定がまだおかしいのもあると思います。
一つの数字だけずっと発生しないように見えます。
それが発生した時点で終了という動作です。

for(i=0; i<arrayLen; i++) {
 ransuu = rand() / RND_MAX * 10.0;

 for(j=0; j<i; j++)
  if(ransuu == *(randArray + j)) {
   ransuu = rand() / RND_MAX * 10.0;
   j=0;
   continue;
  }
 *(randArray + i) = (int)ransuu;
}

「やっぱり」間違っていますか?

977 :969:04/05/10 05:09
すみません、混乱の最中です。

ransuu = rand() / (RND_MAX+1.0) * 10.0;
は0.0〜1.0までのdouble型の乱数を発生させるようです。
正しく動いていません。
しかもその値は繰り返す毎に増えていきます
(0.58187717 -> 0.58710488のように)。
よって"* 10.0"を"* 100.0"にしても解決しません。
今は取り敢えず
ransuu = rand() % MAX;
に戻しました。
これでもまだ正しく動きません。
ああああああ、一時間で終わるプログラムだと思ったのですが…。

978 :デフォルトの名無しさん:04/05/10 06:11
プログラム版のみなさま、教えてください。
PC難民版できいたらこちらでとのことでやってきました。

これってなんですか?
オンラインヘルプを作成してる・・とは思うんですが。
何の言語?
シラネっていえない相手に聞かれて困ってます。
どうぞどなたかお助けください。


+$#KUsing online Help
________________________
+ BROWSE0002:000d
$ To identify a tool or control
# KV9OKA
+ BROWSE0002:000e
$ To display tool tips
# 19J21F_
K General preferences;preferences;preferences:general;Show Tool Tips option


979 :デフォルトの名無しさん:04/05/10 06:20
>>978
D++
略してディープラ

980 :デフォルトの名無しさん:04/05/10 06:28
>>979
ありがとうございますた(涙



981 :デフォルトの名無しさん:04/05/10 06:40
989です。

すいません、いま
D++ 言語、D++ 開発言語、
でぐぐったんですがうまくヒットしませんでした
正式名称を教えてください

つかネタじゃないにょー
すいません、プログラム書いたことない人間なんです。
アホな質問とは思いますが、む版のみなさま、お願いしますだ!

982 :デフォルトの名無しさん:04/05/10 06:44
↑ げ、978ですた

983 :デフォルトの名無しさん:04/05/10 07:24
>>969 面倒だったからint型で、乱数取得も剰余。適当に弄ってくれ。
int GetNoDup(int Now){
    int RndTemp, Flag;
    while(1){
        RndTemp = rand() % 32;
        Flag = 0;
        for(int j=0;j<Now;j++){
            if(RndResult[j]    == RndTemp){Flag = 1; break;}
        }
        if(Flag == 0) return RndTemp;
    }
    return 0;
}

984 :デフォルトの名無しさん:04/05/10 07:31
新スレ
http://pc5.2ch.net/test/read.cgi/tech/1084141064/

985 :969:04/05/10 14:53
>>983

ありがとうございます。
ただ、すみません、後一歩のようです。
埋めるのに1回〜233回くらいかかります。
結果を見ていただければ分かると思いますが、
一つだけ乱数がなかなか発生しない数があります。
今回の例では2がなかなか発生しません。
最後から二番目では2が発生せず、
Ransuu4とRanssu8が両方とも4になっています。
そして2が最後の最後でやっと発生しています。

結果はこの次に貼ります。
プログラムの方も短い(全68行)ので
三回くらい分けて貼るかもしれません。
ご迷惑をお掛けしています。m(__)m

986 :969:04/05/10 14:54
結果(最後の二回を表示しています):
Ransuu0 = 7.000000 Ransuu1 = 9.000000 Ransuu2 = 5.000000
Ransuu3 = 1.000000 Ransuu4 = 4.000000 Ransuu5 = 0.000000
Ransuu6 = 8.000000 Ransuu7 = 3.000000 Ransuu8 = 4.000000
Ransuu9 = 6.000000
0: 56
1: 56
2: 0
3: 56
4: 112
5: 56
6: 56
7: 56
8: 56
9: 56
Ransuu0 = 0.000000 Ransuu1 = 9.000000 Ransuu2 = 6.000000
Ransuu3 = 4.000000 Ransuu4 = 1.000000 Ransuu5 = 8.000000
Ransuu6 = 7.000000 Ransuu7 = 2.000000 Ransuu8 = 3.000000
Ransuu9 = 5.000000
0: 57
1: 57
2: 1
3: 57
4: 113
5: 57
6: 57
7: 57
8: 57
9: 57
count = 57
Press any key to continue

987 :969:04/05/10 15:04
連続投稿が禁止されているはずなのでこの次はすぐには貼れません。
#include <stdlib.h>
#include <time.h>
#define MAX 10
const double RND_MAX = 32767.0; //現在未使用

int GetNoDup(int);

void main(void)
{
int arrayLen = 10, allset = 0, count = 0, i, j;
double ransuu;
int verben[MAX];
int *randArray;

for(i=0; i<MAX; i++)
verben[i] = 0;

while(allset == 0)
{
randArray = (int *)malloc(sizeof(int)*arrayLen);
srand( (unsigned)time( NULL ) );
for(i=0; i<arrayLen; i++) {
ransuu = rand() % MAX;
// ransuu = rand() / (int)((RND_MAX+1.0) * 100.0);

988 :969:04/05/10 15:06
for(j=0; j<i; j++)
if(ransuu == *(randArray + j))
ransuu = GetNoDup(j);

printf("Ransuu%d = %f\n", i, ransuu);
*(randArray + i) = (int)ransuu;
}

for(i=0; i<arrayLen; i++)
verben[*(randArray + i)]++;

for(i=0; i<MAX; i++)
printf("%d: %d\n", i, verben[i]);

for(i=0; i<MAX; i++) {
if(verben[i] == 0) {
allset = 0;
break;
} else
allset = 1;
}
count++;
}
printf("\ncount = %d\n", count);
free(randArray);
return;
}

989 :969:04/05/10 15:08
int GetNoDup(int Now){
int RndTemp, Flag;
int RndResult[MAX];
while(1){
RndTemp = rand() % MAX;
Flag = 0;
for(int j=0;j<=Now;j++){
if(RndResult[j] == RndTemp){Flag = 1; break;}
}
if(Flag == 0) return RndTemp;
}
return 0;
}
- 完 -
あれ、貼れましたね。

990 :デフォルトの名無しさん:04/05/10 15:21
たとえば20までの数をランダムに10個ほしければ1〜20の数列を用意して、ランダムに並び替えて、あたまから10個とる。
どうしてだれも突っ込んでないんだろう。

もしかして、泳がせてたの?

991 :デフォルトの名無しさん:04/05/10 15:24
あ、>972と>974が指摘してるのに、却下してるだけか。

992 :969:04/05/10 16:05
>>991

まず、自分のやっていた方法が>>973さんの方法に近かったのでこちらを選びました。
正直「やっつけ」なプログラムで良いので早く作れる方が良いと思いました
(結局時間はかかっていますが)。
それと(質問の中にも書きましたが)将来的には551個を扱うんです。
それらを毎回並べ替えて最初の10個というのは効率的にどうかと思ったのも理由の一つです。
でも、そちらの方法の方が良いですか?
こっちの方法も本当に後一歩っぽいんですが。

993 :デフォルトの名無しさん:04/05/10 16:26
>>992
>>972のページでは、たった2行で表現されてます。難しいですか?

994 :デフォルトの名無しさん:04/05/10 16:29
>>992
そもそも元の問題と違うプログラムを作っているように見えるが。

簡略化のために1〜5の数値をランダムに生成するときのことを考える。
一つめは0/5二つめは1/5三つ目は2/5四つ目は3/5五つ目は4/5の確率で
再び計算する必要があるうえに、それぞれ0,1,2,3,4回の比較が必要である。
ベストケースでも、11回の比較が必要。

・・・とここまで書いて気付いたが、あまりにも変なコーディングだ。

995 :969:04/05/10 16:34
>>993

分かりました。今からやってみます。

996 :969:04/05/10 16:36
>>994

いえ、その計算は5個のうち5個の乱数を発生させるときの計算でしょう。
僕の場合は最終的には551個のうち10個を発生させるので再計算は
そう頻繁には起こらないと考えます。
どうでしょうか?

997 :デフォルトの名無しさん:04/05/10 16:51
>>996
問題を見る限りでは、551個なのは配列としか読めない。

998 :969:04/05/10 16:56
verben[MAX]が将来551個になります。
*randArrayは10個以上必要ありません。
そろそろ新スレに移ります。

999 :デフォルトの名無しさん:04/05/10 17:30
999

1000 :デフォルトの名無しさん:04/05/10 17:30
1000!!

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

234 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)