C言語なら俺に聞け 143
■ このスレッドは過去ログ倉庫に格納されています
配列をシャッフルするって方法は、カードゲームや麻雀の洗牌で使うよね。
文字通りシャッフル、一揃いの順番を混ぜ合わせる操作として。
連番で初期化した配列の、乱数で選んだ2つのインデクスの要素同士を入れ替え。
ある程度の回数ループさせると重複なく順番がバラバラになる。
他には、素朴な乱数ルーチンと組み合わせて乱数の質を改善する方法として
乱数プール(配列)の中から乱数で選んだ(インデクスの)値を出すってのを
見たことがある。
最近は高品質な生成アルゴリズムを使うのだろうけど。 「Fisher-Yates shuffle」で検索! >>連番で初期化した配列の、乱数で選んだ2つのインデクスの要素同士を入れ替え。
>>ある程度の回数ループさせると重複なく順番がバラバラになる。
それは初心者にありがちな悪手。回数を増やすと見た目はランダムっぽく
なるけどあまりランダムにならない。
1枚目を全体からの一様乱数、2枚目を残りから一様乱数、・・・という具合に選ぶのがいい std::shuffle,
古いコンパイラならstd::random_shuffle 昨日の768です
Fisher-Yates shuffle
が凄く役に立ちました。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void shuffle(int ary[], int size);
int main(void) {
int list[10] = { 0,1,2,3,4,5,6,7,8,9 };
shuffle(list, 10);
for (int i = 0; i < 10; i++) {
printf("%d,", list[i]);
}
return 0;
}
void shuffle(int ary[], int size) {
for (int i = 0; i < size; i++) {
int j = rand() % size;
int t = ary[i];
ary[i] = ary[j];
ary[j] = t;
}
} これだと10桁表示されてしまうので、4桁分表示するように変更
色々有り難うございました
HitとBlowの処理行ってきます 4桁なら乱数4つ求めた後で重複調べてあったらまた求めるっての繰り返しても良いんじゃないか? arySize = 10
range = 0...arySize # 未満
ary = range.to_a
def shuffle(ary, size, range)
for i in range
j = Random.rand(size)
puts "i=#{i} ← j=#{j} : value #{ary[i]} ← #{ary[j]}"
ary[i], ary[j] = ary[j], ary[i]
end
end
shuffle(ary, arySize, range)
p ary
i=0 ← j=8 : value 0 ← 8
i=1 ← j=9 : value 1 ← 9
i=2 ← j=2 : value 2 ← 2
i=3 ← j=9 : value 3 ← 1
i=4 ← j=7 : value 4 ← 7
i=5 ← j=5 : value 5 ← 5
i=6 ← j=4 : value 6 ← 7
i=7 ← j=8 : value 4 ← 0
i=8 ← j=7 : value 4 ← 0
i=9 ← j=9 : value 3 ← 3
[8, 9, 2, 1, 6, 5, 7, 4, 0, 3]
>j = Random.rand(size)
Ruby で書いたけど、これだと、0〜9 のまま一定だろ。
Fisher-Yates shuffle では、ループの度に、1ずつ減らさないといけないよな? >>779
Fisher-Yates shuffle で検索したら、関連情報として >>777 の方法が
良くないことと、その理由が説明されてるページが見つかった。
可能な並べ方の全パターンが等しい確率で出現するか否か、
というアルゴリズムの原理からの比較は分かりやすくて説得力があった。
個人のページみたいなのでリンクは張らないけど、
「Fisher-Yates shuffle ランダムシャッフル」で出るかと。 最初から全部の組み合わせの分のテーブル作っておいて、
そいつを乱数で選ばせりゃ一発で決まりだろ? いまどきハードディスクなんかテラバイト単位でデータ持てるじゃん。 ふつうに Fisher-Yates でいいと思うよ >>788
おお。斬新なアイデア。
4つしかなくて0〜9ならそれでも問題ないな。(メモリが全然ないような特殊な場合を除いて)。 それするなら、0〜9999の乱数を求めて各桁を使えばいい
配列を作る必要はない >>791
トランプゲーム作った時は真面目にカード配列ん中シャッフルしたわな。懐かしい、 >>793
各桁の検査の為に分解するんだからむしろ効率悪いんじゃね? /wiki/シャッフル (カード)
各シャッフル方法をプログラムで再現するには・・・ >>800
つうか、一回限りなら意味が無いかもな。
テーブルに出た回数も記録して同じ組み合わせは出ない様にも出来たり、テーブル自体も別系列の乱数でシャッフルするとか、
使い道は無限大さ。 なんとなくこねくり回しても数学的に無意味な感じがしてならない。 実務で使う関数とか数学的には何の意味も無いなんて、当たり前だろw C言語覚えたい頼む
このアホに教えこんで理解させるとしたらまずなんのテキスト使う?
教え上手のおまいらに最後の希望を託す
(ちな言われたことは必ずやります) >>805
http://codepad.org/
このコードパッドというサイトで、「ハローワールド」を表示するプログラムを実行できたら、ほめてやろう。
C言語でプログラムを実行するには「おまじない」が必要だ。 しかも、そのおまじないは半角文字と全角文字を区別する。
一文字でも間違えたら正しく動かない。 確実に正しくプログラムを入力したいなら、「コピペ」すればいい。 >>805 これまでのプログラミング言語の経験を申告してもらうかな。
「この辺の知識は既に持ってる相手」という前提があれば、
教える側としても出発点や道順を選びやすい。 >>809
アセンブラ一筋30年
x86, ARM, MIPS, SH, Z80, 6809, R8C, RL78, C2000, PIC, AVR, STM8, HAL9000, RX >>806
片山さんチーッス!
後ほど報告しますね
>>809
FE試験でCASLを福島本で少々もちろん落ちました春再戦はCで挑みたく…
ほかPython本チラ見と開発環境整え中に他の試験のため頓挫
覚えたいが独学でグイグイいけるモチベもなく(あればここで泣きついてないw)誰かにゆるい階段のお膳立てをしてもらい登ってみようかと。これでだめならセンス無しでITから撤退しますw >>810
6809案件って30年前はほぼ収束してないか? >>811
C++をやれ、accelerated c++ を必死に登れば、開運する ところで IT と C言語 って割と隔たりないか? C99とかC14とかCにもいろいろ種類があるそうですが
特定の種類で書かれたソースコードであるかチェックしたいのでsouiu
lint toolってありませんか? >>817
C14なんて聞いたこと無い
gcc には -Wc90-c99-compat と -Wc99-c11-compat オプションがある C14はC++14を勘違いしたんだろうね
Cの種類は、K&R, C90(C89), C99, C11の4つが主要バージョン
主要でないバージョンというと、primeval CとかC84などがある
C90をC89と言ったりするのは、ISO/IEC9899:1990がANSI X3.159-1989を追認する内容だからだ
日本語版のJIS X3010:2003はC99の直訳 >>803
いやほら乱数ってハードウェア利用せずに計算だけでやる場合は処理を複雑にしても無意味なことあるじゃない。 >>810
懐かしいのがあるなあ。
でもアセンブラできるなら覚えるの早いかも。 ワンタイムパスワードで送られてくる数字を事前に当てられたらすごいと思います >>811
時間かかってんな。
「#include <stdio.h>
int main(void) {
printf("ハローワールド\n");
return 0;
}」
これだけ入力してrunさせるだけだぞ。 >>824
putsは知らんヤツ多いし、教育上、発展的ではない。 古典だし、コピペでもいいとしてるし
それなら printf にしときたい所存 putsは使ってないな一行読み込みだしその後の文字加工がめんどくさいからprintfで済ましちゃうな 初心者にprintfを教えると、信頼の出来ない文字列を第一引数として渡す事故が
起きかねないので教育上よろしくないのは常識
[MQ]Z はアホの代名詞 >>805
高橋まな?の
やさしいC
って本がおすすめ プログラミング初心者です
struct hoge *tmp = NULL;
以下うろ覚え
tmp->hage = xxxxx;
最近上記のようなコードに出会いました
明らかにNULLなのにアロー演算子で参照してもぬるぽしないことってあるんでしょうか? tmp->hage = xxxxx は、0番地にアクセスしてるわけじゃなくて
0 + hageのオフセット番地にアクセスしてるわけだから、
hageのオフセット番地が有効なメモリまでズレてれば
ヌルぽしないんじゃない? 組み込みならゼロ番地付近をアクセスするためにありうるかもな。
あるいは単にそのコード部分が動いていないか。 0番地に値を書くのと、ヌルポインタアクセスは見分けが付かないからなぁ なので、NULLの値を全く違う値にしてる処理系もあるんだよ。 >>837>>838>>839
皆さん凄いですね
確かにその可能性あるかもしれません
しばらくそのコードを確認できないので
確認できたら結果報告します >>810
HAL9000?
処理系あるんだっけ? >>838
> 組み込みならゼロ番地付近をアクセスするためにありうるかもな。
これで当たりだと思うけど、
そもそも組み込み(≒MMU無し)ならどこアクセスしてもヌルポしないがな。 >>835
そもそも何が起きてもおかしくない = なにも起きないかもしれない
から
コンパイラによってはコード生成すらしないことだってあり得るし >>843
> そもそも組み込み(≒MMU無し)ならどこアクセスしてもヌルポしないがな。
そんなもん機器による
ROM領域に書き込んだりなにも割り当てられてない領域を読み出したら例外を発生させるとか普通にある >>845
その例外を発生させるものがMMUなんだが 固定のアドレス範囲で例外出だけならMMUほどの複雑な機能いらないっしょ >>846
知ったか乙
アクセス対象がなかったらタイムアウトでバスエラーにするとかにMMUなんてものは要らん >>847-848
ゆとり死ね
つか組み込みの0番地なら普通にアクセスできるほうが多いと思うが。
ARMだとベクタのようだし。 ARMだと未割り当てエリアのアクセスは例外発生する >>849
> ゆとり死ね
指摘されたら逆ギレとかどっちがゆとりだよ w
> つか組み込みの0番地なら普通にアクセスできるほうが多いと思うが。
組み込みなんてピンきりだから普通にとか言っても意味ない
そもそも
> 組み込み(≒MMU無し)
の認識がおかしい
> ARMだとベクタのようだし。
ARMもピンきりでMMU持ってる奴も多いからARMだから0番地アクセスできるとか無知すぎる >>848
セグメントフォルト、バスエラーは同期例外だ
非同期(タイムアウト)でバスエラーなんか起きたら困る
知ったか乙 C言語じゃないけど聞いて良いですか(´;ω;`)
バッチ利用して設定ファイル書き換えたい
1. ユーザーに入力してもらう
2. iniの値をそれで上書き
x.ini
AAA=1
BBB=2
CCC=3
↓
AAA=1
BBB=192.168.0.1
CCC=3
キーはBBBで固定
設定値が少ないから一度全部読み込んで一行ずつtmpに書き込んで〜ってのも問題ない
一行ずつ読み込んで別ファイルに出力とかはできたんだけど
BBBなら〜って判別ができないです >>854
>C言語じゃないけど聞いて良いですか(´;ω;`)
ダメ >>855
そそそそんなぁ(´;ω;`)
まあそうだよね
すみませんでした >>853
恥の上塗り乙
68Kだと普通の設計だぞ
https://www.slac.stanford.edu/BFROOT/www/Detector/DAQ/Infrastructure/Maint/177aih.pdf
あとバスエラーの定義はプロセッサによって異なるからプロセッサも限定せずに
> セグメントフォルト、バスエラーは同期例外だ
とか書くと知ったかがばれるので注意しろよ w >>854
C言語でやりたいならここでいいけど、バッチでやりたいならこっち
【.cmd】 バッチファイルスクリプト %12 【.bat】©2ch.net
http://mevius.2ch.net/test/read.cgi/tech/1489207631/
あとバッチはその手の文字列操作があまり得意でないので個人的にははPowerShellとか使った方が楽だと思う
【最強CUI】PowerShell -Part 2 [無断転載禁止]©2ch.net
http://mevius.2ch.net/test/read.cgi/tech/1480109402/ 68kでのバスエラーとは/BERRがアサートされることで
何をセンスして/BERRをぶっ叩くかは基板次第だな PC-9801
0x000000 - 0x0003FF IVT(割り込みベクターテーブル)
まぁ弄るなら割禁とか保険かけるんで専用ライブラリ使うかアセンブラコード書くな。 割り込みと例外は違う
まあバスエラー相当が割り込みであがるアーキもあるけど longjmpやC++のthrowのような例外と割り込みは違うが
ソフトウエア割り込みだの記憶保護例外だのは割り込みと同列なもので
CPUのマニュアルでも同じ章に書いてある >>857
この文脈ではメモリアクセスに伴って発生バスエラーであり、それが非同期って事はアスセスして読めた後で、やっぱさっきのなし、ノーカン、ノーカン
って事だぞ お前は班長か? >>865
理解してない奴は、混乱の元だから割り込んで来ないように C言語のヌルポとハード0番地って同じである必要は無いんだよね 0xffffffff番地でもいいはずだね
要は、Cで合法的に定義されたオブジェクトが決して含まないアドレスを
1つ決めごと作っておいてそれを空ポインタということにしようということと
規格合致処理系はそれを必ず決めておかなければならないということ
C以外のたとえばアセンブラで定義されたオブジェクトまでがその規則に従うとは限らないし
そういうオブジェクトをCで扱えてはならないとまでは言ってない
あくまで自己責任でやる限り余計な邪魔立てはしない ポインタはポインタであってアドレスではない
けど中途半端に知ってるとポインタとアドレスがイコールと思い込んでしまう
ヌルポインタはアドレスで説明できないポインタの例だね バスエラーってのは、あらかじめ決めた領域以外をアクセスしょうとしたら発生するのであって、読んだ後にここ読めないからなんて動作はしない。
むしろ決めて無い場合は幾らでも読み書き出来てしまう。例えそれが嘘でも虚構でもな。
後からノーカンなんてならない。 >>871
>例だね
ヌルポインタ以外に特異点はないのでは? >>872
奇数アドレスからのワードアクセスでもでるぞ
なんとかしてくれる方が少数派かと >>874
それは命令アドレスのLSB見りゃ即出せる罠 >>872
わかってない奴は割り込むなって言っただろ
痛々しいぞ ■ このスレッドは過去ログ倉庫に格納されています