如何获得类似输入格式的随机相似整数?

How to get random similar integers of the format like input?

假设我有一个像 20.65 这样的十进制数。我想得到 x 个随机十进制数如下:

  1. 应该有相同的位数。
  2. 应该有相同的小数位数。
  3. 如果输入的整数为负数,则应为负数。
  4. 任何输出都不应重复或与输入相同。

例子

我给出了这样的输入:

Enter number : 50.26
Enter no of random numbers to be generated : 5

那么它的输出应该是这样的:

12.36
69.74
58.39
54.56
94.45

例二:

输入:

Enter number : 5650.265
Enter no of random numbers to be generated : 5

那么它的输出应该是这样的:

1652.326
6925.743
5844.394
5464.562
9448.454

示例 3:

输入:

Enter number : -456
Enter no of random numbers to be generated : 5

那么它的输出应该是这样的:

-566
-492
-452
-151
-944

我试过的:

from random import randint

n = float(input("Enter number : "))
x = int(input("Enter no of random integers to be generated : "))

min_choice = int('1'+''.join('0' for i in range(len(str(n))-1)))
max_choice = int(''.join('9' for i in range(len(str(n)))))

for i in range(x):
    print(randint(min_choice, max_choice))

输出为:

Enter number : 53.25
Enter no of random integers to be generated : 5
44864
29942
25832
20500
68083

所以,因为我无法计算我被击中的小数位。

您可以将输入转换为 str 然后使用 split

user_input = 123.321
input_parts = str(user_input).split('.') # This will return a list ["123", "321"]

然后你可以用 len

得到每个的长度
left_side = len(input_parts[0])
right_side = len(input_parts[1])

使用这些长度生成适当长度的整数并将它们连接起来。

left_num = str(random.randint(10**(left_side - 1),(10**left_side)-1)) 
right_num = str(random.randint(10**(right_side - 1),(10**right_side)-1))

现在你有 2 个长度合适的数字。加入他们吧。

sides = [left_num, right_num]
merge = '.'.join(sides)
final_num = float(merge)

您可以将其拆分为两个函数,一个用于生成单个数字,另一个用于收集值以确保不包含重复项:

import random

def gen_num(inp): 
    out = "" 
    if inp[0] == '-':
        out += "-"
        inp = inp[1:]      # Skip sign

    # The loop insures the generated numbers 
    # are of the same length as inp
    for dig in inp: 
        if dig == ".":     # Keeping decimal separator where it was 
            out += "." 
        else: 
            out += str(random.randint(1, 9)) 
    return out 

def gen_nums(inp, n): 
    out = set()            # Sets can't contain duplicates
    while len(out) < n: 
        num = gen_num(inp)
        if num != inp:     # Making sure no output number is same as input
            out.add(num) 
    return out 


if __name__ == "__main__":
    inp = input("Enter number: ")
    n = int(input("Enter no of random numbers to be generated: "))
    for v in gen_nums(inp, n):
        print(v)

注意不要将输入转换为浮点数再返回,您可能会遇到浮点数错误。
另请注意,在给定约束的情况下可以生成有限数量的数字(您不能从输入 1 生成 9 值)并且您可能想要定义在这种情况下应该发生什么(你认为使用上面的代码会发生什么?)。