选取不同随机数的方法

本文介绍两种从1至100中随机抽取10个不重复数字的算法实现:一种通过逐步减少选择范围并调整数组来实现高效抽取;另一种利用位图记录已抽取的数字,确保随机性的同时避免重复。

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

2011-02-23 wcdj

 

问题: 有1,2,3,......,100个数,要求从中随机取出10个数,不能重复。

思路1:
第一次随机产生0到99之间的下标,第二次随机产生0到98之间的下标……依次类推,每次产生到哪个下标就把那个位置上的数“扣出去”……“扣”的时候不要移动之后的所有元素,那样效率低,把最后一个提上来即可。

其实那行循环初始化数组的操作也可以去掉,直接用下标。只是会有人觉得可理解性差一些。

 

思路2:
如果元素不多,利用位图方法,把每次随机生成的数存放在一个位图中,每次存放前判断位图中是否已经存在此元素,直到存放了10个元素为止。

 

 

 

 

 

Paillier公钥密码体制是一种基于数学难题的公开密钥加密技术,主要用于保证数据的机密性和计算的不可逆性。这里我会为你展示如何使用Python实现Paillier算法的部分关键功能。首先,你需要安装`pycryptodome`库,可以通过`pip install pycryptodome`安装。 以下是基本的Paillier加密、解密以及加法同态性的示例: ```python from Crypto.Random import get_random_bytes from Crypto.Util.number import bytes_to_long, long_to_bytes from pycaesar.cipher import Paillier # 初始化Paillier对象 public_key, private_key = Paillier.generate_keys() # 加密明文数据 plaintexts = [40, 60] ciphertexts = [] for pt in plaintexts: ciphertexts.append(public_key.encrypt(pt)) # 输出加密后的数据 for i, ct in enumerate(ciphertexts): print(f"Encrypted {plaintexts[i]}: {ct.nth_root(1)[0]}") # 验证加密和解密 decrypted_data = [private_key.decrypt(ct) for ct in ciphertexts] print("Decrypted data:", decrypted_data) # 实现加法同态性(对两个已加密的数据做加法) plaintext_a = 40 plaintext_b = 60 encrypted_a = public_key.encrypt(plaintext_a) encrypted_b = public_key.encrypt(plaintext_b) sum_ciphertext = encrypted_a * encrypted_b sum_decrypted = private_key.decrypt(sum_ciphertext) print("Sum of encrypted data (decrypted):", sum_decrypted) # 随机选取验证值 random_numbers = [get_random_bytes(8).decode() for _ in range(2)] random_plaintexts = [int(random_number) for random_number in random_numbers] random_encrypted = [public_key.encrypt(random_plaintext) for random_plaintext in random_plaintexts] # 解密验证 random_decrypted = [private_key.decrypt(random_ciphertext) for random_ciphertext in random_encrypted] print("Random numbers after encryption and decryption:", random_decrypted)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值