2011-01-17 14 views
2

大量のテストデータを自動的に生成しようとしていますが、必要なランダム値のセットを生成する方法を理解するのに苦労しています。値に合計する個々の範囲内の乱数を生成

異なる範囲内で発生するランダムな値のセットを作成する必要があります。結果の値の合計は、テストケースに応じて所定の値を超えるか、またはそれ以下でなければならない。

値の合計が800より大きくする必要がある場合の値の合計が800未満の有効なソリューションでなければならない場合たとえば、

Value | Minimum value | Maximum Value 
A | 100 | 300 
B | 200 | 500 
C | 300 | 600 
D | 100 | 300 

有効な解決策が

A = 200 
B = 400 
C = 500 
D = 100 

だろうがうbe

A = 100 
B = 200 
C = 300 
D = 100 

この問題は、最適化機能を使用してのみ解決できますか? ABCDの値を計算する他の方法はありますか?

私はSQLを使用してこの問題を解決しようとしていますが、擬似コードのアプローチについても興味があります。

答えて

2

試してみるまでお試しください。

declare @T table (Value char(1), MinValue int, MaxValue int) 
insert into @T values('A', 100, 300) 
insert into @T values('B', 200, 500) 
insert into @T values('C', 300, 600) 
insert into @T values('D', 100, 300) 

declare @R table (Value char(1), Rnd int) 

declare @Sum int 

while 0=0 
begin 
    delete @R 
    insert into @R 
    select Value, round(((MaxValue - MinValue -1) * rand() + MinValue), 0) as Rnd 
     from @T 

    select @Sum = sum(Rnd) from @R 
    if @Sum > 800 
     break 
end 

select *, @Sum 
from @R 
+0

+1少なくともこのソリューションは終了します。 –

+0

まあ...あなたは比較する値を選択するのに注意する必要があります。あらかじめMinValueまたはMaxValueを使用していくつかのチェックを行うとよいでしょう。 –

0

E /所望の合計によって4つの乱数、A、B、C、D

合計それら= E

スケールA、B、C、Dを生成します。

+0

私はあなたがtotal/Eを意味すると思っていますが、スケーリングが最小/最大値の下または上にABCDの値を置くかもしれないので、これはまだ機能しません。たとえば、A = 300、B = 400、C = 600、D = 100、ターゲットが700の場合、D = 50となり、最小値は100未満です。 – niallsco

関連する問題