一意の数値 [5, 123, 49176, 30982, 542] のセットがあるとします。数値を変換して、0 から 25 の範囲の一意の数値 (整数) の別のセットを取得したいとします。
この問題を解決するのに役立つアルゴリズムを提案できますか?
あなたはそれらを正規化するつもりですか?
raw = [5, 123, 49176, 30982, 542]
normalization = [(i-min(raw))/(max(raw)-min(raw))*25 for i in raw]
print(normalization)
それはあなたに与えます:(すべての要素は一意であることが保証されています)
[0.0, 0.059994712330438675, 25.0, 15.749628846271177, 0.2730267840800472]
結果の要素が整数に制限されている場合:
import random
raw = [5, 1, 23, 49176, 30982, 542]
if len(raw) > 26: #there's no way to get more than 26 unique elements from 0~25 integers
print("mission impossible")
else:
print(random.sample(range(26), len(raw)))
それはあなたに与えるでしょう(例えば):
[23, 4, 13, 10, 18, 24]
これらはあなたにとって2つの妥協的な方法です. しかし、あなたのコメントによると、実際にはドメインがすべて整数でコドメインが [0,25] の整数である単射関数が必要です。残念ながらミッションインポッシブルです。
(整数を仮定)
要素を並べ替えて、各要素に(並べ替えられたリストで)インデックスを付けることができます。数値が 26 未満 (または正確に) であると仮定すると、目的の範囲が得られます。セットの現在の順序 (反復順序など) として数値を設定するだけで、同じセットの決定論的結果を許容できない場合は、並べ替えを回避することもできます。
一般的なケースのハッシュが必要な場合は、それを実行できないことに注意してください-範囲が26を超える場合-重複が発生します。これは、範囲がハトであり、範囲 [0,25] がピジョンホールであるピジョンホールの原則から直接来ています。
各数値をランダム関数のシードとして使用してから、重複がないことを確認してください。
アミットが言ったように、25を超えるセットがある場合、これも崩壊します.