合計 昨日 今日

temp()の回数が2の倍数回だと入れ替わらない

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: 遊び人
[URL]
ぴよぴよ(262 ポイント)
Date: 2017年8月12日(土) 22:18
No: 1
(OFFLINE)

 temp()の回数が2の倍数回だと入れ替わらない

文字列同士を入れ替えるtemp()関数を何度か繰り返す場合、2の倍数回だと何度やっても入れ替わりません。
理由が分かる方がおられましたらお教えください。
コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
typedef struct {
    char string[4];
} Test[3];
Test test;
 
void temp()
{
    int x, y;
    char temp[4];
    srand((unsigned)time(NULL));
   
    x = rand() % 3;
    while (1) {
        y = rand() % 3;
        if (x != y) break;
    }
 
    strcpy(temp, test[x].string);
    strcpy(test[x].string, test[y].string);
    strcpy(test[y].string, temp);
}
 
int main(void)
{
    int i;
 
    strcpy(test[0].string, "abc");
    strcpy(test[1].string, "def");
    strcpy(test[2].string, "ghi");
 
    printf("before\n0:%s 1:%s 2:%s\n", test[0].string, test[1].string, test[2].string);
 
    /*----------この部分----------*/
    for (i = 0; i < 8; i++) {
        temp();
    }
    /*----------------------------*/
    printf("after\n0:%s 1:%s 2:%s\n", test[0].string, test[1].string, test[2].string);
 
    return 0;
}

Name: みけCAT
[URL]
伝説なるハッカー(672,107 ポイント)
Date: 2017年8月12日(土) 22:23
No: 2
(ONLINE)

 Re: temp()の回数が2の倍数回だと入れ替わらない

temp関数で無駄に毎回乱数を初期化しており、かつ秒単位の時刻が変わらないうちに処理を終えているので、
毎回同じ場所を入れ替え、2の倍数回だと元に戻って入れ替わらないように見えるのでしょう。
何も考えず乱数(適当な数の列)を使いたいなら、srand関数はプログラム開始時に1回だけ呼び出しましょう。
temp関数しか書き換えてはいけない場合は、static変数を用いて最初に呼ばれた時のみsrandを呼び出すようにするといいでしょう。

↓参考
c - srand() — why call it only once? - Stack Overflow

Offtopic :
rand()関数は性能が低い可能性があり、暗号などで用いる乱数には用いるべきではないというのはまた別の話。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: 遊び人
[URL]
ぴよぴよ(262 ポイント)
Date: 2017年8月12日(土) 22:35
No: 3
(OFFLINE)

 Re: temp()の回数が2の倍数回だと入れ替わらない

[解決!]

なるほど、srand関数は一度だけでいいのですね・・・
勘違いしておりました、ありがとうございます!


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[15人]