Tsql 在单个范围内生成随机数,这些随机数总和为一个值

Tsql 在单个范围内生成随机数,这些随机数总和为一个值,tsql,random,range,Tsql,Random,Range,我正在尝试自动生成一大组测试数据,我正在努力理解如何生成所需的一组随机值 我需要创建一组发生在不同范围内的随机值。根据测试用例,结果值的总和必须大于或小于预定值 比如说, 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 A = 100 B =

我正在尝试自动生成一大组测试数据,我正在努力理解如何生成所需的一组随机值

我需要创建一组发生在不同范围内的随机值。根据测试用例,结果值的总和必须大于或小于预定值

比如说,

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
A = 100
B = 200
C = 300
D = 100
如果值之和必须小于800,则将使用有效的解决方案

A = 200
B = 400
C = 500
D = 100
A = 100
B = 200
C = 300
D = 100
只能使用优化功能解决此问题吗?是否有其他方法计算ABCD的值


我希望使用SQL解决这个问题,但我也希望听到一种伪代码方法。

生成4个随机数,a、B、C、D

求和,等于E


按E/所需总数缩放A、B、C、D。

再试一次,直到你得到你想要的

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

我认为您指的是总计/E,但这仍然不起作用,因为缩放可能会使ABCD的值低于或高于最小/最大值。例如,目标为700的A=300、B=400、C=600、D=100将导致D=50小于最小值100。。。您必须小心选择要比较的值。最好事先使用MinValue或MaxValue进行一些检查。