随机数

LOJ6267 生成随机数

一曲冷凌霜 提交于 2020-03-19 08:17:40
Link 先考虑 \(m=2^k\) 的情况。 首先我们可以设计一种可行的策略:连续抛 \(k\) 次硬币得到 \(2^k\) 种结果,而每个数 \(i\) 对应其中 \(a_i\) 种。 不难发现每个数对应的一些结果是可以合并的,即扔不到 \(k\) 就能确定是哪个数。 可以证明最优的合并方案的结果就是 \(\frac{a_i}m\) 在 \(2\) 进制下的各个 \(1\) 位。 对于每个 \(a_i\) ,设 \(\frac{a_i}m=\sum\limits_{x\in S(a_i)}\frac1{2^x}\) ,那么结果就是 \(\sum\limits_{i=1}^n\sum\limits_{x\in S(a_i)}\frac x{2^x}\) 。 然后考虑 \(m\ne2^k\) 的情况。 简单推理可以发现,此时有一些结果不会对应任何一个数,也就是说 \(S(x)\) 可能变成了一个无限集,但是 \(m=2^k\) 时的结论依旧适用。 记 \(f(\frac xm)=\sum\limits_{i\in S(x)}\frac i{2^i}\) ,那么答案就是 \(\sum\limits_{i=1}^nf(\frac{a_i}m)\) 。 但是直接求 \(f\) 看上去不太现实,我们发现 \(f(2x-\lfloor2x\rfloor)=2f(x)-2x\)

random模块

混江龙づ霸主 提交于 2020-03-19 04:59:19
1)random.random random.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0 2)random.uniform    random.uniform的函数原型为:random.uniform(a, b),用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。 如果a > b,则生成的随机数n: b <= n <= a。 如果 a<b, 则生成的随机数n: a<=n<=b. 3)random.randint   random.randint()的函数原型为:random.randint(a, b),用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b 4)random.randrange random.randrange的函数原型为:random.randrange([start], stop[, step]),从指定范围内,按指定基数递增的集合中 获取一个随机数。如:random.randrange(10, 100, 2),结果相当于从[10, 12, 14, 16, ... 96, 98]序列中获取一个随机数。random.randrange(10, 100, 2)在结果上与 random.choice(range(10, 100, 2) 等效 5)random

【tensorflow】中tf.random.uniform用法

北城以北 提交于 2020-03-17 22:45:21
# 定义一个随机数(标量) random_float = tf . random . uniform ( shape = ( ) ) tf . random . uniform ( ) 的常用用法是产生一个随机数 当()里shape指定大小时,比如shape = ( 6 , 6 ) 例如: random_float = tf . random . uniform ( shape = ( 6 , 6 ) ) 输出: random_float tf . Tensor ( [ [ 0.5413165 0.9985248 0.81406665 0.24037695 0.5445132 0.8941165 ] [ 0.72098756 0.26960266 0.16734755 0.6911627 0.4066162 0.9881915 ] [ 0.8730695 0.48352456 0.00285757 0.81027746 0.17887259 0.7702277 ] [ 0.14711106 0.20008647 0.7115674 0.13419867 0.76057637 0.25808132 ] [ 0.22025907 0.97988033 0.33997393 0.96810377 0.02345192 0.22615612 ] [ 0.13810503 0

一个可能的NEO链上安全随机数解决方案

情到浓时终转凉″ 提交于 2020-03-17 18:16:23
某厂面试归来,发现自己落伍了!>>> 0x00 困境 链上安全随机数生成应该算是一个比较蛋疼的问题,哪怕你的系统再牛逼,合约程序困在小小的虚拟机里,哪怕天大的本事也施展不开。 更悲催的是,交易执行的时候,是在每一个节点都执行一遍,那就意味着,要想保证同一个交易在所有节点执行结果都一致, 那么交易获取的随机数也就必须一致。目前来看,当交易执行的时候,合约所能获取到的数据无非是 (1)已有的链上数据。 (2)通过调用别的合约获取返回值。 (3)交易传递的参数。 对于第一种数据来源,已有的链上数据都是公开的,随机数获取算法也是公开的,无论怎么搞,通过链上数据获取的随机数结果怎么看都不怎么靠谱, 用户在交易发布之前,稍微分析甚至不需要分析就能猜到自己可能获取到的随机数值范围。 如果通过调用别的合约来获取返回值,这就进入了死循环————别的合约的随机数哪里来的? 最后一种,交易传参,这就更不能用于随机数生成了,本来随机数是要让用户交易执行之前完全不可预测的,现在直接跟用户输入相关的话倒不如直接让用户自己设置自己的随机数来的直接。 0x01 共识前的共识 研究过NEO共识的同学应该都知道,NEO共识协议采用的是dBFT(没研究过的可以看 https://my.oschina.net/u/2276921/blog/1621870 ),这种共识协议不需要靠计算量证明,也不需要大家提供股权证明

蒙特·卡罗方法(Monte Carlo method)

♀尐吖头ヾ 提交于 2020-03-17 16:54:47
蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。与它对应的是确定性算法。 这个方法的发展始于20世纪40年代,和原子弹制造的曼哈顿计划密切相关,当时的几个大牛,包括乌拉姆、冯.诺依曼、费米、费曼、Nicholas Metropolis,在美国洛斯阿拉莫斯国家实验室研究裂变物质的中子连锁反应的时候,开始使用统计模拟的方法,并在最早的计算机上进行编程实现。 现代的统计模拟方法最早由数学家乌拉姆提出,被Metropolis命名为蒙特卡罗方法,蒙特卡罗是著名的赌场,赌博总是和统计密切关联的,所以这个命名风趣而贴切,很快被大家广泛接受。被不过据说费米之前就已经在实验中使用了,但是没有发表。说起蒙特卡罗方法的源头,可以追溯到18世纪,布丰当年用于计算π的著名的投针实验就是蒙特卡罗模拟实验。统计采样的方法其实数学家们很早就知道,但是在计算机出现以前,随机数生成的成本很高,所以该方法也没有实用价值。 随着计算机技术在二十世纪后半叶的迅猛发展,随机模拟技术很快进入实用阶段。(类比深度学习,感叹~) 对那些用确定算法不可行或不可能解决的问题,蒙特卡罗方法常常为人们带来希望。 蒙特卡罗基本思想

软件工程个人作业2

狂风中的少年 提交于 2020-03-16 17:27:12
1》题目要求: 可怜的二柱子同学,老师又对他的自动出题系统提出了新的要求: 1、题目避免重复; 2、可定制(数量/打印方式); 3、可以控制下列参数: *是否有乘除法; *是否有括号(最多可以支持十个数参与计算); *数值范围; *加减有无负数; *除法有无余数! 2》设计思想: 这次编程主要是在上一次的基础之上,作进一步的要求,然后实现不同方式的输出。 1)题目避免重复的实现:先定义三个数组,然后再循环时将产生的运算符和两个运算数(随机产生的三个数)存入数组,每进行一次循环,就将数组中的数和前面的相比,如果两个运算符和运算数都和前面某一组数相等,那么重新产生一组随机数,实现避免重复。 2)可定制的实现:打印数量,就是输入一个数,然后进行该数次循环,然后输出。打印方式主要是可以在屏幕上输出,也可以实现输出到一个记事本文件中,这用到了输入输出流 的知识。 3)1.是否有乘除法,用if语句实现,如果有乘除法,则进一步选择是否有余数,我的程序是对有余数的选择直接输出,如果没有余数,就是被除数减去余数在输出。 2.数值范围:可以定义一个数s,用随机数rand()%s 就是产生1~s的随机数。 3.加减法无负数,就是保证后一个数比前一个数大,有负数,在其中加入负号。 ps:是否括号功能较难,暂时还未实现 源代码: //四则运算2 //2016 3 14 Sunzhe #include

Python实现鸢尾花数据集分类问题——基于skearn的SVM

扶醉桌前 提交于 2020-03-16 00:14:10
Python实现鸢尾花数据集分类问题——基于skearn的SVM 代码如下: 1 # !/usr/bin/env python 2 # encoding: utf-8 3 __author__ = 'Xiaolin Shen' 4 from sklearn import svm 5 import numpy as np 6 from sklearn import model_selection 7 import matplotlib.pyplot as plt 8 import matplotlib as mpl 9 from matplotlib import colors 10 11 12 13 # 当使用numpy中的loadtxt函数导入该数据集时,假设数据类型dtype为浮点型,但是很明显数据集的第五列的数据类型是字符串并不是浮点型。 14 # 因此需要额外做一个工作,即通过loadtxt()函数中的converters参数将第五列通过转换函数映射成浮点类型的数据。 15 # 首先,我们要写出一个转换函数: 16 # 定义一个函数,将不同类别标签与数字相对应 17 def iris_type(s): 18 class_label={b'Iris-setosa':0,b'Iris-versicolor':1,b'Iris-virginica':2} 19 return

C语言生成随机数

别说谁变了你拦得住时间么 提交于 2020-03-15 17:25:30
强烈建议阅读 → 重新整理后的文章 2012年的时候写过一篇C语言生成随机数的博客,点击量比较高。后来发现那篇博客描述的不是非常准确,这里重新整理一遍。写惯了高级语言,现在回看C的语法,真的是挺难的^o^。 一、方法介绍 生成随机数,需要用到两个函数 srand 、 rand ,头文件为 #include <stdlib.h> 1.1 void srand ( unsigned int seed ) 生成随机数种子,注意 如果使用相同的种子后面的 rand() 函数会出现一样的随机数 。常见的用法是使用一些动态的值来初始化这个种子: srand((unsigned) time(NULL));srand((int)getpid()); 1.2 int rand ( void ) 根据 srand 初始的随机数种子产生一个伪随机数(注意不是真正的随机),范围为 0 - RAND_MAX。RAND_MAX 至少为 32767,我电脑为 2147483647。可通过取模来产生不同范围的随机数,如: int randint = rand() % (MAX + 1 - MIN) + MIN; 1.3 举例实现 下面给出了一个举例的实现(POSIX.1-2001),帮助更好的理解其原理,每次调用 rand 的时候,其实是改变了一个全局变量,从而导致下一次调用返回了不同的值。 static

Go随机数

痞子三分冷 提交于 2020-03-15 17:24:56
Go math/rand包用于生成随机数。 代码: package main import "fmt" import "math/rand" func main() { fmt.Println(rand.Intn(100)) //产生0-100的随机整数 fmt.Println(rand.Float64()) //产生0.0-1.0的随机浮点点 s1 := rand.NewSource(42) //用指定值创建一个随机数种子 r1 := rand.New(s1) fmt.Print(r1.Intn(100), ",") fmt.Print(r1.Intn(100)) fmt.Println() s2 := rand.NewSource(42) //同前面一样的种子 r2 := rand.New(s2) fmt.Print(r2.Intn(100), ",") fmt.Print(r2.Intn(100)) fmt.Println() } 返回结果: 81 0.9405090880450124 5,87 5,87 多次重复执行上述代码,返回的结果仍然是一样的。所以为了使得调用的随机数不相同,就需要使用NewSource来提供一个随机的种子。比如: s2 := rand.NewSource(time.Now().Unix()) 如果在同一次执行中多次调用,返回的结果是不一样的:

给定1-a的随机数生成器,产生1-b的随机数生成器

自闭症网瘾萝莉.ら 提交于 2020-03-14 11:07:49
转自 http://www.code123.cc/959.html 先给出一个例子,后面会有扩展 题目 给你一个能生成1到5随机数的函数,用它写一个函数生成1到7的随机数。 (即:使用函数rand5()来实现函数rand7())。 解答 rand5可以随机生成1,2,3,4,5;rand7可以随机生成1,2,3,4,5,6,7。 rand5并不能直接产生6,7,所以直接用rand5去实现函数rand7似乎不太好入手。 如果反过来呢?给你rand7,让你实现rand5,这个好实现吗? 一个非常直观的想法就是不断地调用rand7,直到它产生1到5之间的数,然后返回。 代码如下: 1 2 3 4 5 6 int Rand5 ( ) { int x = ~ ( 1 << 31 ) ; // max int while ( x > 5 ) x = Rand7 ( ) ; return x ; } 等等,这个函数可以等概率地产生1到5的数吗?首先,它确确实实只会返回1到5这几个数, 其次,对于这些数,都是由Rand7等概率产生的(1/7),没有对任何一个数有偏袒, 直觉告诉我们,Rand5就是等概率地产生1到5的。事实呢?让我们来计算一下, 产生1到5中的数的概率是不是1/5就OK了。比如说,让我们来计算一下Rand5生成1 的概率是多少。上面的函数中有个while循环