チャレンジでランダム生成を指定する方法


16

Metaのコンセンサスに従って、質問はここでトピックになります。

この「課題を書くときに避けるべきこと」に照らして、私は特定の種類のオブジェクトのランダムな生成を伴う課題について考え始めました。

時々、fooをランダムに生成するチャレンジを投稿したいことがあり

  1. 指定されたものがfooであるかどうかを確認するのは非常に簡単です。
  2. 「良質の」ランダムfooをすばやく生成するのは少し難しくなります。

例として、fooは、どの方向にも4つの等しいビットのセグメントがないバイナリマトリックスである場合があります。与えられたバイナリ行列がfooであるかどうかを確認するのは簡単ですが、うまく分散した分布でランダムなfooを生成するには、バックトラッキングアルゴリズムなどが必要なようです。

とにかく、ランダムなfooとして適格なものを客観的に指定する必要があります。プログラムを数回実行すると、結果が常に異なって見えるという直感的な意味で「予測不能」になりたいです。最も制限的なアプローチは、出力が一様にランダムであることを要求することです。すべての有効なfooが同じ確率で生成されます。これは通常、制限が厳しすぎます。有効なfooをすべて生成し、重複を削除して、退屈で遅いものを選択するために保存する方法がわからないからです。

私の次のアイデアは、すべての有効なfooが生成される肯定的な確率を持つことを要求することです。ただし、これは次のアプローチが有効であることを意味します:fooの場合はランダムなfooのようなもの(この例ではランダムなバイナリマトリックス)を生成し、それを返す場合はハードコードされたfooを返します)。また、これは基本的にランダムマトリックスジェネレーターに付けられたfoosの単なる認識器であるため、やや退屈です。

予測不可能なランダムなfooの一般的な定義はありますか?

TL; DR

「予測不可能な」ランダムに生成されたオブジェクトを指定するための良い方法はありますか?


ハードコーディングを禁止するメタランダムの標準的な定義がありますが、完全に均一である限りは制限されません。
ジオビット16

5
いい質問ですね。私は過去に、ランダム性を指定するのが難しいことを発見しました。特に、あなたが説明するシナリオでは、ランダムな候補を生成し、無効な場合はやり直すことができるという問題もあります。それは均一な分布を提供しますが、ランタイムは非決定的です。均一な分布を指定する場合、実際のソリューションが完全に均一になることはないという問題もあります。これは非常に微妙な問題です。+1
マーティンエンダー

@MartinEnder右、私はそのアプローチを忘れていました。私はそれと時間制限のある他の遅いアルゴリズムを禁止することができますが、それでも「ハードコードされた1つのfoo」ソリューションを許可します。
ズガルブ16

あなたはK3 / K4 CPRNGを指定することができますように、ほとんどの言語は、ライブラリーがありますようだen.wikipedia.org/wiki/Pseudorandom_number_generator
ユアン

1
@Zgarbが「生成とやり直し」を許可しないことに関する大きな問題は、言語のRNGライブラリの大部分がまさにそれを行うことです。
ネイサンメリル

回答:


5

1000種類のfooを返す

これにより、ハードコードされた値を返すことができなくなり、半分まともなゴルフができます。ただし、正当なfooジェネレーターは、実際にそれらをチェックしていない限り、重複したfooを出力する可能性がわずかにあります。チェックの負担を取り除くために、経験的にテストされた故障率、たとえば10%を許容可能と指定できます。

誕生日のパラドックスに注意してください、重複の可能性はあなたが考えるよりも高いかもしれません。fooが100万個しか存在しない場合、ランダムなfooが1,000個あると、どこかに重複がある可能性が約0.6になり、fooの生成が完全に均一であると仮定されます。これが問題になる可能性がある場合は、生成される1000ごとに900個の一意のfooが必要です。これは、本物のfooジェネレーターにははるかに寛大ですが、ハードコーディングにはまだ実用的ではありません。

これにより、fooのようなものを繰り返し生成し、fooを取得するまでfoonessをチェックすることもできます。私はこれは有効な解決策だと思いますが、気に入らない場合:

早くやる

完全にランダムなfooのようなものがfooになる可能性はおそらく非常に低いので、時間制限を指定するとfoo生成の真の試みが強制される可能性があります。

:異なる言語間の速度の違いに適応するには、Hackerrankのような言語に応じて異なる時間制限したいことがありhttps://www.hackerrank.com/environmentを。ただし、十分な大きさのfooを指定すると、fooのようなランダムなものがfooになる可能性が非常に低くなる可能性があるため、「宇宙の熱死前」ルールで十分です。


あなたはここにいると思います。「プログラムをN回実行すると、少なくとも90%の時間で重複が発生しません」は具体的で非常に簡単にテストでき、ブルートフォースや単純な拒否サンプリングを防ぐための時間制限と組み合わせることができます。
ズガルブ16

2

私は問題に対する究極の解決策を持っていると主張しません(または、このリストは網羅的です)が、思い浮かぶいくつかの可能なアプローチと、それらがうまくいかない理由を概説したいと思います。また、ランダム性のソースとして現在のタイムスタンプを使用することが十分に「予測不可能」であるかどうか、確率分布の特定のプロパティを適用する方法など、接線上の問題には対処しません。ハードコーディングを使用するソリューションの回避に焦点を当てます。

解決策ではありません:明示的にハードコーディングを禁止します

これは悪い考えです。これは観察不可能な要件です(つまり、プログラムを実行するだけで満足するかどうかを判断することはできません)。これはPPCGでは強く推奨されず、他のプラットフォームでプログラムを実行する場合、提出が検証される場合はまったく不可能な場合があります自動化された方法。このような要件の問題は、「ハードコーディング」の客観的な定義を見つけることから始めなければならないということです。一般に、これを試しても、事態は悪化するだけです。

ハードコーディングを実行不可能にする

完全に禁止することはできないが、人々にそれを使用させたくない場合は、ハードコーディングが単に競争的アプローチではないようにチャレンジを設計することができます。これは、生成されるオブジェクトが十分に大きく、非圧縮性であり、コードに1つの例を入れると、ランダムに有効なソリューションを生成するアルゴリズムを記述するよりも多くのバイトが必要な場合に可能です。あなたの特定の例では、それはもちろんのことではありません。なぜなら、恒等行列は有効であり、一般に簡単に生成できるからですが、他の問題についてはそうではないかもしれません。ターゲットオブジェクトが十分に不規則な場合は、サイズを大きくする必要があります。これはおそらく、実際のアルゴリズムのバイトカウントには影響しませんが、ハードコードされた部分を爆破します。

出力をパラメーター化する

多くの場合、これらの問題には、例のマトリックスのサイズなど、1つ以上の自然なパラメーターが伴います。その場合、そのパラメーターを入力にすれば、ハードコーディングを不可能にするか、少なくとも非実用的にすることができます。場合によっては、手動または広範な検索で見つかった特定のパラメーター値に対して特定のソリューションをハードコーディングするのは簡単かもしれませんが、一般的にこれらのソリューションのインスタンスには単純な閉じた形式がないため、そうではありません任意の入力のデフォルト値を簡単に生成できます。繰り返しますが、これは恒等行列が任意のサイズで機能するため、言及した例には当てはまりませんが、この関連する問題の最適な解決策です通常は非常に不規則であるため、有効な値を積極的に検索せずにデフォルト値を設定することはできません。これを時間制限と組み合わせて、デフォルト値のブルートフォース検索を回避できます。

入れていくつかの確率分布に制限を

完全に無制限の確率分布を放棄したい場合は、それに制約を加えることができます。これにより、回答者はその分布を自由に選択できますが、ハードコーディングが困難または不可能になります。

  • 頭に浮かぶ最も単純な制約は、可能な出力が特定のしきい値を下回るように、最小確率と最大確率の差を要求することです。ハードコーディングされたアプローチでは、ほとんどすべての出力に対してほぼゼロの確率があり、デフォルト値に対して1に近い確率があります。最大差が0.1未満であることが必要な場合は、アプローチをオプションにするために10(ランダムに選択された)デフォルト値が必要です。同様に、可能な出力ごとに最小の確率、たとえば1 /(2 * N *)を要求することもできます。ここで、Nは可能な出力の数です。
  • または、分布に(尤度)ギャップがないことを要求して、サイズδ(ユーザーが選択)の間隔がなく、高い確率と低い確率の両方が存在するようにすることができます。これは、ハードコーディングのアプローチによって生成される可能性が高い可能性に関して、外れ値が存在しないことを意味します。

これらのアプローチの主な問題は、それらが推論するのがはるかに難しく、答えの正しさを証明することが困難であり、実験的に正しいことを検証することは大きな出力スペースでは不可能な場合があることです。それでも、それらは、ハードコーディングを不可能にする可能性のあるプログラムに主に観察可能な要件を提供します。

非デフォルト値の確率を高める1つの方法は、デフォルト値にフォールバックする前にランダムなfooを複数回見つけることを試みることになるため、これらのアプローチには時間制限も必要になる場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.