【问题标题】:Ensure that the sum of two randomly generated numbers is equal to the sum of another two randomly generated numbers确保两个随机生成的数字之和等于另外两个随机生成的数字之和
【发布时间】:2020-03-03 21:26:00
【问题描述】:

我正在编写一个程序来计算均匀杆(质心在中间)上的转动力(力矩)。我需要将杆的长度分成四个值,它们本身不必相等;但是,前两个值的总和必须等于后两个值的总和。杆的总长度必须是随机生成的 - 那我该怎么做呢?

这是我随机生成数字的方式:

random_value_one = random.uniform(1, 5)
random_value_two = random.uniform(1, 5)
random_value_three = random.uniform(1, 5)
random_value_four = random.uniform(1, 5)
total_length_of_rod = random_value_one + random_value_two + random_value_three + random_value_four
centre_of_mass = total_length_of_rod / 2

【问题讨论】:

    标签: python algorithm random


    【解决方案1】:

    简而言之,您的第四个值实际上并不是随机的。因此,您可以生成前两个并计算总和。然后在该总和范围内生成第三个。第四个值是差异。您还可以从随机拆分的总长度或一半长度开始工作。

    import random
    
    # option1: random 1st and 2nd, 3rd splits total, fourth is difference
    rv1 = random.uniform(1, 5)
    rv2 = random.uniform(1, 5)
    sumOfFirst2 = rv1 + rv2
    rv3 = random.uniform(1, sumOfFirst2-1)
    rv4 = sumOfFirst2 - rv3
    
    print("Option1:")
    print(rv1,rv2,rv1+rv2)
    print(rv3,rv4,rv3+rv4)
    
    # option 2: random total length, split each half randomly
    totalLength = random.uniform(4,20)
    sumOfFirst2 = totalLength/2
    rv1         = random.uniform(1,sumOfFirst2-1)
    rv2         = sumOfFirst2 - rv1
    rv3         = random.uniform(1,sumOfFirst2-1)
    rv4         = sumOfFirst2 - rv3
    
    print("Option2:")
    print(rv1,rv2,rv1+rv2)
    print(rv3,rv4,rv3+rv4)
    
    # option 3: random half length, split each side
    sumOfFirst2 = random.uniform(2,10)
    rv1         = random.uniform(1,sumOfFirst2-1)
    rv2         = sumOfFirst2 - rv1
    rv3         = random.uniform(1,sumOfFirst2-1)
    rv4         = sumOfFirst2 - rv3
    
    print("Option3:")
    print(rv1,rv2,rv1+rv2)
    print(rv3,rv4,rv3+rv4)
    
    # option 4: random extermities, random sum of center parts then split center
    rv1         = random.uniform(1,5)
    rv4         = random.uniform(1,5)
    center      = random.uniform(2,10)
    totalLength = center+rv1+rv4
    rv2         = totalLength/2 - rv1 
    rv3         = totalLength/2 - rv4
    
    print("Option4:")
    print(rv1,rv2,rv1+rv2)
    print(rv3,rv4,rv3+rv4)
    

    输出:

    Option1:
    3.8733926704150394 1.2002268887772458 5.073619559192285
    3.840231922558826 1.2333876366334593 5.073619559192285
    
    Option2:
    3.547962226731686 1.2866434919683414 4.834605718700027
    1.52708327731985 3.3075224413801774 4.834605718700027
    
    Option3:
    5.271438412416368 3.9102475112312245 9.181685923647592
    2.116625606537367 7.065060317110225 9.181685923647592
    
    Option4:
    2.0745608124206196 4.236051851683254 6.310612664103874
    4.163042898863589 2.1475697652402848 6.310612664103873 
    

    如果您担心分布,您可以选择最适合您要求的方法。

    【讨论】:

    • 太棒了——希望我能想到这一点!谢谢!
    • @SendViaAirmail 不确定它有多出色,但边际分布完全不同。真的是你想要的吗?总长度分布看起来也有点偏离
    【解决方案2】:

    一种方法是获取所有具有正确总和的数字对,然后随机选择一个。

    import random
    r1 = random.randrange(1, 6)
    r2 = random.randrange(1, 6)
    pairs = [x for x in [(i, j) for i in range(1, 6) for j in range(1, 6)] if sum(x) == r1 + r2]
    r3, r4 = random.choice(pairs)
    total_length_of_rod = r1 + r2 + r3 + r4
    centre_of_mass = total_length_of_rod / 2
    

    【讨论】:

      【解决方案3】:

      这个逻辑呢?生成前两个随机数并将它们相加。然后生成第三个随机数,并测试它是否小于前两个的相加。如果是,最后一个随机数将是[(前两个的加法)-(第三个随机数)]。如果不是,则再次生成第三个随机数。这确保了可以添加到相同的长度(如果第三个数字更大,则不可能)。第四个数字不是随机生成的,但它是随机的,因为第三个数字是随机的,它必须等于前两个数字的总和,所以最后一个数字实际上没有选择。

      这样可以避免嵌套循环并提高效率:)

      【讨论】:

        【解决方案4】:

        这应该可以让你到达你需要的地方:

        random_sum = random.uniform(1, 5)
        random_value_one = random.uniform(1, random_sum)
        random_value_two = random_sum - random_value_one
        
        random_value_three = random.uniform(1, random_sum)
        random_value_four = random_sum - random_value_three 
        

        【讨论】:

        • 您是否认识到如果值在 [1...5] 范围内,sum 将在 [2...10] 范围内?
        【解决方案5】:

        把整个东西放在一个你可以调用的函数中,然后在最后有一个 if 循环。检查是否 ((rod1 + rod2) == (rod3 + rod4)),如果不是,则调用该函数重新启动它。此外(或者如果 python 不允许这样的逻辑工作)您可能需要声明 rod1 + rod2 和 rod3 + rod4 的新变量,然后比较它们的值。

        【讨论】:

        • 它已经在一个可调用的函数中——我只是没有把那段代码放在问题中,因为它很长而且我不想堵塞问题的细节。
        猜你喜欢
        • 1970-01-01
        • 2015-01-31
        • 2014-12-19
        • 2014-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多