Python自动生成多个随机数,保持其和不变

本文介绍如何使用Python的random模块在特定公差范围内生成随机数,并确保这些数保留到小数点后四位,同时保持其总和不变。通过列表生成式简化代码,实现多次生成满足条件的随机数集合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

(1)在公差范围内,产生5个随机数
(2)5个随机数,保留小数点后四位,且和始终不变
(3)产生5组这样的随机数组

要求

(1)所用Python模块:random
(2)安装模块

pip install random
代码
import random
for i in range(5):
    while(True):
        list_random = [round(random.uniform(-0.042,+0.025),4)for _ in range(5)]
        sum_random = 0
        for j in range(len(list_random)):
            sum_random = sum_random + list_random[j]
        if(sum_random == -0.0296):
            if i == 0:
                print(sum_random)
            print(list_random)
            break
运行结果

在这里插入图片描述

知识点复盘

(1)产生指定公差带的随机数:random.uniform(a,b)
uniform:格式,可当做按格式产生随机数记忆

random.uniform(-0.042,+0.025)

(2)保留小数点后四位:round(c,num)

round(random.uniform(-0.042,+0.025),4)

(3)for _ in range(5) 与 for i in range(5)

  • 这两种方法是没有区别的,在Python变量命名规则中,可以以下划线、字母开头命名,这里只用了下划线,本质上没有区别。都是临时变量,仅用一次。
  • range(5)产生的是一个list:[0,1,2,3,4],从0开始,不包括5.

(4)Python高级特性:列表生成式

[round(random.uniform(-0.042,+0.025),4)for _ in range(5)]

注意:写成列表生成式时候,生成元素(round(random.uniform(-0.042,+0.025),4))要放在前面,for循环放在后面,另外还可以将在for循环后面添加if的判断。

具体列表生成式部分内容,参看廖雪峰的官方网站:
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00138681963899940a998c0ace64bb5ad45d1b56b103c48000

<think>我们被要求生成一个模拟六爻随机情况的Python代码。六爻是《易经》中的占卜方法,通过抛掷硬币或类似方法生成六条线(爻),每条线可以是阴(断开的)或阳(连续的),并且可能有变爻(老阴或老阳)。通常,使用三枚硬币抛掷来生成一爻: - 三枚硬币的抛掷结果:三枚硬币每枚有正反两面,通常规定有字的一面为阴(值为2),无字的一面为阳(值为3)。但另一种常见方法是:三枚硬币,每枚硬币正面(阳)为3,反面(阴)为2,然后求: - 3个正面:3+3+3=9,为老阳(阳爻,但会变) - 2正1反:3+3+2=8,为少阴(阴爻,不变) - 1正2反:3+2+2=7,为少阳(阳爻,不变) - 3个反面:2+2+2=6,为老阴(阴爻,但会变) 另一种常见的简化方法是使用01来表示,然后通过随机数生成。但为了符合传统,我们使用上述的硬币方法。 因此,生成一爻的过程是:模拟抛掷三枚硬币,计算总和,然后根据总和确定爻的类型: - 6:老阴(阴爻,变爻) - 7:少阳(阳爻,不变) - 8:少阴(阴爻,不变) - 9:老阳(阳爻,变爻) 我们需要生成六爻,即重复上述过程6次。 代码目标:模拟六爻的生成,并输出一个包含六爻的列表。每个爻用两个属性表示:爻的类型(阴或阳)是否变爻。我们可以用一个元组(爻值, 是否变爻)来表示,或者用一个字符串表示。但为了后续可能的使用,我们用一个字典列表来表示,每个字典包含: - 'value': 可以是'阴'或'阳' - 'change': 布尔值,True表示变爻,False表示不变 或者,也可以用一个字符串表示每一爻,例如: - 老阴:'--X'(或6) - 少阴:'--'(或8) - 少阳:'—'(或7) - 老阳:'—O'(或9) 但考虑到输出清晰,我们先用数字表示,然后可以转换为符号。或者直接输出数字,因为数字6、7、8、9是传统表示。 然而,用户要求是模拟随机情况,所以我们只需生成随机爻。 步骤: 1. 对于每一爻,模拟抛掷三枚硬币,每枚硬币随机生成2(阴)或3(阳)。我们可以用随机整数来模拟,比如随机选择2或3。 2. 计算三枚硬币的总和。 3. 根据总和确定这一爻: 总和为6 -> 老阴(阴,变爻) 总和为7 -> 少阳(阳,不变总和为8 -> 少阴(阴,不变总和为9 -> 老阳(阳,变爻) 4. 重复6次,得到六爻。 代码实现: 使用random模块的randint函数来生成每枚硬币的值(2或3)。 注意:由于六爻是从下往上生成的,所以我们的列表应该是从第一个爻(初爻)到第六爻(上爻),即列表索引0代表初爻(最下面),索引5代表上爻(最上面)。但是,在输出时,我们可以按顺序从下往上,也可以从上往下?实际上,在记录时,我们通常按生成顺序存储,生成顺序就是初爻到上爻。所以,我们按顺序生成,然后存储在一个列表中,列表的第一个元素是初爻(最下面),最后一个元素是上爻(最上面)。 输出格式:我们可以输出一个列表列表中的每个元素是一个数字(6,7,8,9)或者一个字符串,或者一个字典。为了灵活性,我们先输出数字列表,然后也可以输出一个符号表示。 但是,用户没有指定输出格式,所以我们输出两种:一种是数字列表(6,7,8,9),另一种是符号表示(用字符串列表,如['--X', '—', ...])。 我们定义符号表示: 6 -> '--X' (老阴) 7 -> '—' (少阳,一条连续的线,但这里用一字线表示,实际可用两个减号表示阳?但通常阳爻用连续线,阴爻用断开线。在文本中,我们常用: 阳爻:'—' 或 '---'(为了与阴爻对称) 阴爻:'- -' 或 '--' 但为了区分变爻,我们可以在阳爻变爻时用'O'标记,阴爻变爻时用'X'标记。所以: 6(老阴):'--X' (阴爻,变爻) 7(少阳):'---' (阳爻,不变) 注意:这里用三个连字符表示阳爻,以便与阴爻的两个分开(但阴爻中间有空格,而阳爻没有?)实际上,在文本中,阴爻通常表示为中间有空格的,如'- -',而阳爻是连续的'—'(一个字符)或'---'(三个连字符)。但为了简单,我们可以这样: 6: '--x' (注意:小写x,或者大写X?) 7: '---' 8: '-- ' (少阴,但这样无法区分,所以还是用中间空格) 实际上,我们可以这样表示: 阳爻不变:'———' (用三个字符) 阳爻变爻:'—○' (但这里用两个字符,或者用三个?) 阴爻不变:'— —' (三个字符,中间空格) 阴爻变爻:'—×—' ?这不太统一。 另一种常见的文本表示法(在《易经》文本中): 老阴:⚋(但这是Unicode字符,在终端可能显示不一致)或者用文字描述。 考虑到兼容性,我们使用简单的字符串: 6: '--x' 或 '---x' ? 或者用单个字符?但为了清晰,我们使用: 6: '阴(变)' 7: '阳' 8: '阴' 9: '阳(变)' 但用户可能希望看到符号,我们可以用字典来映射,然后输出两种形式:数字符号。 我们决定输出一个包含6个数字的列表,然后同时输出对应的符号字符串。符号字符串我们用以下方式: 6: '老阴' 或直接输出符号表示,但为了简单,我们用字符串:'阴(变)',等等。 不过,我们也可以输出标准的六爻符号,即用线条表示,并且按从下往上的顺序打印。 但是,由于是随机模拟,我们先生成数字,然后根据需求再转换为符号。 因此,代码主要功能:生成一个包含6个元素的列表,每个元素是6,7,8,9中的一个。 然后,我们可以将数字列表转换为符号列表,例如: [7,8,9,6,7,8] -> ['阳', '阴', '阳(变)', '阴(变)', '阳', '阴'] 或者,我们也可以输出一个字典列表,包含更详细的信息。 我们先实现基本功能:生成六爻的数字表示。 代码结构: 1. 导入random模块。 2. 定义一个函数,比如叫generate_hexagram(),无参数,返回一个包含6个数字的列表。 3. 在函数内部,循环6次,每次循环: a. 生成3个随机整数,每个整数在23之间(包括23)。 b. 计算三个数的。 c. 将添加到列表中。 4. 返回列表。 然后,我们可以写一个辅助函数,将数字列表转换为符号列表,比如: def convert_to_symbols(hexagram): symbols = [] for num in hexagram: if num == 6: symbols.append('老阴') elif num == 7: symbols.append('少阳') elif num == 8: symbols.append('少阴') elif num == 9: symbols.append('老阳') return symbols 或者,我们可以直接输出数字,因为数字是标准表示。 另外,我们也可以输出一个从下往上的打印,即先打印初爻(列表的第一个元素)作为最下面,然后依次向上。但用户可能希望看到的是从下往上的顺序,所以列表的第一个元素就是初爻,最后一个元素是上爻。打印时,我们可以按顺序打印(初爻到上爻),也可以按上爻到初爻?但传统上,画卦是从下往上画,所以打印顺序应该是先打印初爻(作为第一行),然后第二爻,直到上爻(最后一行)。但如果我们按列表顺序存储(索引0是初爻,索引5是上爻),那么打印时从索引0开始打印,就是先打印初爻(最下面),然后依次向上,但这样打印出来初爻在屏幕最下面,上爻在屏幕最上面?在控制台打印,我们是按行从上到下打印的,所以如果我们先打印初爻,那么初爻就会在屏幕的最上面一行,而上爻在屏幕的最下面一行,这不符合习惯。 因此,为了在控制台输出时符合从下往上的顺序(即初爻在下面,上爻在上面),我们应该先打印上爻(即列表的最后一个元素),然后从后往前打印。或者,我们在存储时,将初爻存储在列表的最后,上爻存储在列表的最前面?但这样不符合生成顺序(生成顺序是初爻先生成,然后二爻...)。 通常,我们按生成顺序存储(初爻在索引0,上爻在索引5),然后打印时,我们反转列表,即从索引5到0打印(从上爻到初爻),这样在屏幕上从上爻(最上面一行)打印到初爻(最下面一行),但实际卦象是上爻在最上面,初爻在最下面,这样打印出来就是: 上爻 ... 初爻 这样,屏幕最上面一行是上爻,最下面一行是初爻,符合卦象。 因此,打印时,我们可以逆序输出列表。 但是,用户可能不需要打印,只需要数据。所以我们先只生成列表,存储顺序是初爻(索引0)到上爻(索引5)。用户可以根据需要打印。 现在,我们编写代码,只返回数字列表。同时,我们可以提供一个打印函数,按从下往上的顺序(即初爻在下面,上爻在上面)打印,也就是在打印时,我们按逆序(从索引5到0)打印,但这样打印出来的顺序是:先打印上爻,然后五爻...最后初爻,这样初爻在屏幕最下面?不,在控制台,先打印的行在上面,后打印的在下面。所以如果我们先打印上爻(索引5),那么上爻就会在屏幕的第一行,然后往下依次是四爻、三爻、二爻、初爻(最后一行)。这样,初爻在屏幕最下面,上爻在屏幕最上面,符合卦象。 因此,打印函数可以这样写: def print_hexagram(hexagram): # 从最上面一爻(上爻)开始打印,即从列表的最后一个元素开始,往前直到第一个元素。 for i in range(len(hexagram)-1, -1, -1): # 将数字转换为符号 num = hexagram[i] if num == 6: print('--X') # 或者打印更复杂的符号 elif num == 7: print('———') elif num == 8: print('-- ') elif num == 9: print('—O') # 注意:这里用短横O,但实际阳爻应该是连续的,所以我们可以用三个字符表示 # 但这样打印的符号可能宽度不一致,我们可以统一用三个字符宽度: # 6: '--X' (三个字符) # 7: '———' (三个中文字符,但英文字符下,三个减号) # 8: '-- ' (两个减号加一个空格,但这样不好看) # 9: '—O' (一个长横一个O,但长横在英文中可能用两个减号表示?) 考虑到在英文环境中,我们可以这样: 6: ' - - ' (两边空格,中间断开,然后标记X?)但这样复杂。 或者,我们只输出数字,然后让用户自己理解。 由于用户要求是模拟随机情况,我们先生成数字列表,然后如果需要,再转换为符号。 我们先输出数字列表。 代码: 我们将编写一个函数,返回六爻的数字列表(6个整数)。 另外,我们也可以编写一个函数将数字转换为符号字符串,但作为可选。 因此,我们提供两个函数: - generate_hexagram() -> 返回一个包含6个整数的列表,每个整数在6,7,8,9之间。 - hexagram_to_string(hexagram) -> 将六爻列表转换为一个字符串,按从下往上的顺序(初爻在最下面一行,上爻在最上面一行)显示,每行显示爻的符号表示。 符号表示我们这样定义: 6: '--x' (老阴) 7: '---' (少阳) 8: '-- ' (少阴) # 注意,这里为了对齐,我们使用三个字符:两个减号一个空格,但这样少阴少阳的表示不同,但少阴应该是中间断开的,所以我们可以用两个减号中间加空格,但这样三个字符:'- -'(中间空格),而少阳用三个减号'---',这样对齐。 9: '--o' (老阳) # 但这样老阳老阴都是三个字符,但老阳应该是连续的?所以我们可以用另一种表示:老阳用'—o'(一个长横一个o),但长横在英文中可以用两个减号表示,所以变成'--o',但这样少阳的'---'都是三个字符,但少阳是阳爻不变,老阳是阳爻变,所以我们可以用: 少阳:'———'(三个减号,但这样三个字符) 老阳:'—○'(一个长横加一个圈,但长横用两个减号表示,圈用o,所以变成'--o',但这样就是三个字符,但少阳的表示不同,少阳是三个减号,老阳是两个减号加一个o,这样宽度一样) 少阴:'- -'(三个字符:减号、空格、减号,但这样中间有空格,宽度也是三) 老阴:'-x-'(三个字符:减号、x、减号) 这样,每行都是三个字符,可以对齐。但是,这样表示可能不太标准。 另一种方案:使用Unicode符号,但可能有些环境不支持。 考虑到简单性,我们只输出数字,然后用户可以根据需要转换。 因此,我们先只生成数字列表。 代码实现: 我们写一个函数,模拟一爻的生成: def generate_line(): total = 0 for _ in range(3): total += random.randint(2,3) # 随机生成2或3 return total 然后,生成六爻就是循环6次。 但是,注意:随机数生成时,我们使用random.randint(2,3),它包含23。 然后,我们可以测试一下,确保生成的数字在6到9之间(因为最小是3个2:6,最大是3个3:9)。 现在,我们编写完整代码。</think>以下是用于模拟六爻随机情况的Python代码,实现了传统的三枚硬币生成法: ```python import random def generate_hexagram(): """ 生成随机六爻(基于三枚硬币法) 返回值:包含6个爻的列表,每个元素为6/7/8/9 6=老阴(变爻), 7=少阳, 8=少阴, 9=老阳(变爻) """ hexagram = [] for _ in range(6): # 生成六爻 coins = [random.randint(0, 1) for _ in range(3)] # 0=阴(反面), 1=阳(正面) total = sum(coins) * 2 + 3 # 计算爻值:阴=2,阳=3 hexagram.append(total) return hexagram def visualize_hexagram(hexagram): """ 可视化六爻结果 """ symbols = { 6: "-- × (老阴·变爻)", 7: "--- (少阳)", 8: "-- (少阴)", 9: "--- ○ (老阳·变爻)" } print("从下到上生成的卦象:") for i, line in enumerate(hexagram): print(f"第{i+1}爻: {symbols[line]}") print("\n标准卦象排列(上爻在顶):") for line in reversed(hexagram): # 反转显示,上爻在顶 print(f" {symbols[line]}") # 生成并显示卦象 hexagram = generate_hexagram() visualize_hexagram(hexagram) ``` ### 代码说明: 1. **生成原理**: - 每爻通过抛掷三枚硬币生成,每枚硬币: - 反面(阴)= 2 - 正面(阳)= 3 - 三枚硬币值求(6-9)确定爻的类型[^1] - 重复6次生成完整卦象 2. **爻值含义**: - `6 = 老阴`:阴变阳(`-- ×`) - `7 = 少阳`:阳爻(`---`) - `8 = 少阴`:阴爻(`--`) - `9 = 老阳`:阳变阴(`--- ○`) 3. **输出说明**: - 第一段显示生成顺序(初爻到上爻) - 第二段显示标准卦象(上爻在顶部) ### 示例输出: ``` 从下到上生成的卦象: 第1爻: --- (少阳) 第2爻: -- (少阴) 第3爻: --- ○ (老阳·变爻) 第4爻: -- × (老阴·变爻) 第5爻: --- (少阳) 第6爻: --- ○ (老阳·变爻) 标准卦象排列(上爻在顶): --- ○ (老阳·变爻) --- (少阳) -- × (老阴·变爻) --- ○ (老阳·变爻) -- (少阴) --- (少阳) ``` ### 使用说明: 1. 直接运行生成随机卦象 2. 修改`generate_hexagram()`中的`range(6)`可生成多爻卦 3. 调整`visualize_hexagram()`中的符号可自定义显示样式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值