2011-01-17 3 views
2

Я пытаюсь автоматически генерировать большой набор тестовых данных, и я изо всех сил пытаюсь понять, как сгенерировать набор случайных значений.Генерировать случайные числа в пределах отдельных диапазонов, которые суммируются до значения

Мне нужно создать набор случайных значений, которые встречаются в разных диапазонах. Сумма результирующих значений должна превышать или под заданным значением в зависимости от тестового примера.

Например,

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

Если сумма значений должна быть больше, чем 800 допустимым решением было бы

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

Если сумма значений должно быть меньше, чем 800 допустимым решением было бы 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

4 Генерация случайных чисел, A, B, C, D.

Сумма их, = Е

шкала А, В, С, D от E/желаемого объема.

+0

Я думаю, что вы имели в виду total/E, но это все равно не будет работать, поскольку масштабирование может поместить значение ABCD под или над значениями min/max. Например, A = 300, B = 400, C = 600, D = 100 с мишенью 700, приведет к D = 50, которая меньше минимальной 100. – niallsco