誰もが知っているように、最新のオペレーティングシステムにはスレッドスケジューラがあり、コードが機密ではない内部ロジックに基づいてスレッドをスケジュールするためにさまざまな順序を選択できます。通常は、マルチスレッドコードを設計して、この非決定論が出力に意味のある影響を与えないようにします。
ここでの目標は反対です。[0,99]の間隔で整数を出力しますが、OSスレッドスケジューラにより実行ごとに異なる順序でプログラムを生成します。
次のように定義される「十分な非決定性」を達成する必要があります。
10試行の10の連続セットでは、プログラムは各試行内で少なくとも9の一意の順列を生成する必要があります。連続する10回の試行のいずれかの側で、成功する試行の失敗したセットが妥当な数になる可能性があります。
または、別の言い方をすると、プログラムの100回の実行が必要です。10回の実行の各ブロックには、同じものを出力する最大2回の実行があります。
したがって、98と99を時々入れ替えても、うまくいきません。
これはcode-golfなので、使用するバイト数が最も少ない答えが優先されます。
細目
- 出力をstdoutに書き込みます(1行に1エントリ)
- 2つのスレッドにstdoutへの文字書き込みをインターリーブさせて(たまに)、3桁の数字や空の行などの結果が生じる場合、結果は無効です。
- 上記のルールの唯一の例外は、最後に必要な数を出力した後、空の行を1行発行することです(どういたしまして)
- 必要な値を見逃したり複製したりすると、結果は無効になります
- プログラムは、シングルコアプロセッサで非決定的である必要はありません(ただし、そうである場合は称賛されます)。
- プログラムは、チャレンジの他の要件を満たし、スレッドシステムが言語または言語の標準ライブラリの一部である場合に限り、OSカーネルによって実際には管理されていない緑色のスレッド/ファイバーを使用できます。
- プログラムのランタイムは、最新のプロセッサで5秒未満である必要があります。
- 待機や設定変更など、プログラムの外部で発生する環境の変更を指定することはできません。プログラムは、100回連続して実行するか、各実行の間に1時間を置いて実行するか、並列に100回実行するかに合格する必要があります(これはおそらく実際に役立ちます...)
- GPUやXeon Phiなどのコプロセッサーと、タスク用の独自の内部スケジューリングメカニズムを使用できます。ルールは、グリーンスレッドに適用されるのと同じ方法でこれに適用されます。
- この投稿で指定されたルールに従っている限り、あらゆる種類のスリープ、イールド、その他のトリックでスケジューラを自由に挑発してください。
禁止されている操作
非決定論の唯一の原因は、スケジューラーがスレッドの実行をスケジュールするときです。次のリストは完全ではなく、非決定論の他のソースを認めているために許可されていないことの例を提供することのみを目的としています。
- 任意の種類のPRNGまたはハードウェアRNG機能に直接または間接的にアクセスする(スケジューラーの固有の部分としての場合を除く)。
- あらゆる種類の入力(システム時間、ファイルシステム、ネットワークなど)の読み取り
- スレッドIDまたはプロセスIDの読み取り
- OSスケジューラのカスタマイズ。メインストリームOSの標準OSスケジューラを使用する必要があります
- グリーンスレッド/ファイバースケジューラのカスタマイズも禁止されています。つまり、この課題に対応する言語を作成する場合、OSスレッドを使用する必要があります。
回答の検証
できれば答えはすべての一般的なOSと最新のプロセッサで機能し、サポートの幅に比例して賞賛が与えられます。ただし、これは課題の要件ではありません。少なくとも、回答は1つの最新のSMPプロセッサと最新のOSをサポートする必要があります。ハードウェアの可用性の範囲で主要な回答をテストします。
- 入力がWindows 10 v1607 x64を実行しているi7 5960xで必要な出力を生成しない場合は、必要な環境を指定します
- VMWare Workstationで簡単に再現できるものであれば、正確なOSとVMの仕様を提供してください
- これらの条件のいずれかで作成できない場合は、ヘッダーセクションで説明されているように、テストの同時画面キャプチャと、マウスとキーボードの操作(または非標準の計算による制御スキーム)による画面のハンドヘルドビデオ録画を記録します。デバイスの使用)両方の動画を明確に表示し、回答と一緒に投稿し、それが機能する理由の説明を含める
- または、一致するハードウェアを使用して信頼できる長年のユーザー(あなたではない)に結果を再現し、保証します
- エントリがエキゾチックなプログラミング言語であり、一般的な開発者がコンパイル/ jit /解釈するように設定されていない場合は、設定手順を提供します
- エントリーがJVM / Pythonインタープリター/その他の特定のバージョンに依存している場合は、どれを指定するか
- 私のテストで10回の連続した一連の試行が成功するまでに10分以上かかる場合、失敗します(特に、上限に近い場合は、成功条件が異常な発生にならないようにしてください)ランタイムバインド)