加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
OUE_2.py 4.98 KB
一键复制 编辑 原始数据 按行查看 历史
张妞 提交于 2023-05-11 12:03 . fashionmnist
# -*- coding: utf-8 -*-
"""
@Time    : 2022/5/14 13:39
@Author  : Mr Wang
@FileName: UE_2.py
@SoftWare: PyCharm
"""
from decimal import Decimal
import numpy as np
number=45211 #随机数数量
bits=20 #多少位
# rnd_list =[] # 存随机数
binary_list = [0]*number # 转化为二进制列表
final = [0] * number # 随机响应后的十进制
# def rnd(data):
# rnd_list.append(data)
# return rnd_list
def change(n, pre=19):
'''
把一个带小数的十进制数n转换成二进制
小数点后面保留pre位小数
'''
string_number1 = str(n) # number1 表示十进制数,number2表示二进制数
flag = False
for i in string_number1: # 判断是否含小数部分
if i == '.':
flag = True
break
if flag:
string_integer, string_decimal = string_number1.split('.') # 分离整数部分和小数部分
integer = int(string_integer)
decimal = Decimal(str(n)) - integer
l1 = [0, 1]
l2 = []
decimal_convert = ""
while True:
if integer == 0: break
x, y = divmod(integer, 2) # x为商,y为余数
l2.append(y)
integer = x
string_integer = ''.join([str(j) for j in l2[::-1]]) # 整数部分转换成二进制
i = 0
while decimal != 0 and i < pre:
result = int(decimal * 2)
decimal = decimal * 2 - result
decimal_convert = decimal_convert + str(result)
i = i + 1
string_number2 = string_integer + '.' + decimal_convert
return string_number2
else: # 若十进制只有整数部分
l1 = [0, 1]
l2 = []
while True:
if n == 0: break
x, y = divmod(n, 2) # x为商,y为余数
l2.append(y)
n = x
string_number = ''.join([str(j) for j in l2[::-1]])
return int(string_number)
def change2(n, pre=8):
'''
把一个带小数的二进制数n转换成十进制
小数点后面保留pre位小数
'''
string_number1 = str(n) # number1 表示二进制数,number2表示十进制数
decimal = 0 # 小数部分化成二进制后的值
flag = False
for i in string_number1: # 判断是否含小数部分
if i == '.':
flag = True
break
if flag: # 若二进制数含有小数部分
string_integer, string_decimal = string_number1.split('.') # 分离整数部分和小数部分
for i in range(len(string_decimal)):
decimal += 2 ** (-i - 1) * int(string_decimal[i]) # 小数部分化成二进制
number2 = int(str(int(string_integer, 2))) + decimal
return round(number2, pre)
else: # 若二进制数只有整数部分
return int(string_number1, 2) # 若只有整数部分 直接一行代码二进制转十进制
def perturb1(epsilon, value, m, n=2):
p = 1 / 2 # 概率p
np.random.seed(m)
# 以p的概率生成value,1-p的概率非value
p = np.array([p, 1 - p])
index = np.random.choice([value, 1 - value], p=p.ravel())
return str(index)
def perturb2(epsilon, value, m, n=2):
p = np.e ** (epsilon / (number * bits)) / (np.e ** (epsilon / (number * bits)) + n - 1) # 概率p
np.random.seed(m)
# 以p的概率生成value,1-p的概率非value
p = np.array([p, 1 - p])
index = np.random.choice([value, 1 - value], p=p.ravel())
return str(index)
def main(rnd_list):
# print(rnd_list)
# print(len(rnd_list))
binary_perturb = [0]*number
for i in range(0, number):
binary_list[i] = change(rnd_list[i])
integer = str(binary_list[i]).split('.')[0]
fraction = str(binary_list[i]).split('.')[1]
fraction = fraction.ljust(19, '0')
integer = integer.rjust(1, '0')
str0 = integer + '.' + fraction
binary_list[i] = str0
#都是正数
# if rnd_list[i] < 0:
# str0 =str0
# else:
# str0 = str0
str00=str0.replace('.','')
binary_list[i]=str00
aa=''.join(binary_list)
# print(binary_list)
# print(len(aa))
bb=[0]*(number*bits)
for i in range(len(aa)):
if aa[i] == '1':
bb[i] = perturb1(1, int(aa[i]), i)
if aa[i] == '0':
bb[i] = perturb2(1, int(aa[i]), i)
# print(len(bb))
# print(bb)
oplist=[]
for i in range(0,number):
for j in range(i*bits,(i+1)*bits):
oplist.append(bb[j])
oplist[1:1]=['.']
# print(oplist)
str1=''.join(oplist)
binary_perturb[i]=str1
#都是正数
# str1 = str1[1:]
# print(str1)
# if oplist[0] == '1':
# final[i] = 0 - change2(str1)
# else:
final[i] = change2(str1)
oplist=[]
# print(binary_perturb)
# print(final)
return final
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化