使用rand1来实现randx

时间:2016-12-10 21:12:00

标签: function math random

你有<div class="main"> <div class="container"> Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eligendi earum pariatur, sint, fugiat veniam porro deserunt laboriosam odio obcaecati, repellat numquam placeat aliquid nobis dolor temporibus. Soluta ipsam, quod consectetur tenetur quibusdam aut assumenda accusamus ex perferendis ipsa aperiam sapiente. </div> </div> <div class="flexbox"> <a href="#" class="link prev">Preview</a> <a href="#" class="link next">Next</a> </div>以相等的概率输出0或1。

你需要实现输出0,1,2,3,4,...,x的int rand1(),每个值的概率应该相等。

对于int randx(int x)rand1等函数,可以根据rand3输出轻松设置位。对于rand7,只需调用rand3两次,并根据输出设置位0和1,00,01,10,11将获得相同的选择概率(25%)。但是像rand1这样的函数呢?

2 个答案:

答案 0 :(得分:1)

你有正确的想法。您需要通过连接随机位来生成大于所需二进制数的二进制数。但是,除非x+1是2的幂,否则您需要使用rejection sampling来确保randx以相同的概率返回每个值。为了使拒绝的概率小,比如说小于2 ^ -p,你生成的2的幂应该比必要的p+1位多。拒绝的方法如下:

int rand(int x) {
  choose b such that m = 2^b >= x+1 
  let r_max = m - m mod (x+1)
  do {
    r = base-2 number of r pseudo-random bits
  } while (r > r_max)
  return r mod (x+1)
}

请注意,当x+1是2的幂时,循环始终只执行一次。如果不是,则每次迭代的概率取决于b。向b添加1会使另一次迭代的概率减半。

答案 1 :(得分:0)

在这个问题中,您需要保留一些虚拟输出(拒绝采样,如@Gene指出的那样),您可以在其上重复执行实验。

我在这里提供了两个实现。 第一个是次优,但更容易理解。 第二个更优化但更难一点。最后,我尝试概述证明并链接到Math StackExchange答案

第一种方法 -

第1步 - 运行rand1() x + 1次。

步骤2 - 检查输出是否为热。我的意思是,x + 1只运行1中的一个会产生0而其他所有def randx(x): choice = -1 while choice == -1: for i in range(0, x+1): c = rand1() if c == 1 and choice == -1: choice = i elif c == 1 and choice != -1: choice = -1 break 会产生x+1。如果不是,请重复步骤1.否则,请转到步骤3.

步骤3 - 将索引1打印为输出。

python代码看起来像这样 -

0

第二种方法 -

当然,第一种方法是次优的。你可以做得更好,但它需要更多的代码。假设我们想要在x值(k = ceil(log(x+1))1 / 2^k)之间进行预测。您需要至少2^k次进行实验。现在,每个结果的概率均为k

在这些k = 3种可能性中,将一些分配给数字(由于我们选择function randx(x): choice = -1 runs = ceil(log(x+1)) while choice == -1: output = 0 for i in range(0, runs): output += pow(2, i)*rand1() if output <= x: choice = output ,您将看到您可以为至少一半的可能性分配一个数字)。调用其他可能性虚拟输出。

当您获得虚拟输出时,您只需重复实验即可。如果不这样做,则输出与该输出对应的数字。

例如,如果x = 4,x + 1 = 5.因此我们需要i。分配0,1,2,3,4的二进制表示(000到101)并将剩余的3作为假人。伪代码看起来像这样,

Let p = 1 / 2^k
Let q = 1 - (x+1)*p
Total probability of getting i = p + q*p + q*q*p + q*q*q*p ...
= p/(1-q)
= 1/(x+1)
Hence this sums up to 1 / (x+1).

为什么这样做?

我们给所有数字提供相同的可能事件。如果这些事件都没有发生,我们只是重复这个实验。如果您查看获得数字<?php session_start(); include_once("db.php"); if(isset($_POST['widget_name']) && isset ($_POST['widget_type']) && isset ($_POST['language_support']) && isset ($_POST['widget_description']) && isset ($_POST['widget_dependencies'])){ if($_POST['widget_name'] != "" && $_POST['widget_type'] != "" && $_POST['language_support'] != "" && $_POST['widget_description'] != "" && $_POST['widget_dependencies'] != ""){ $name = $_POST['widget_name']; $type = $_POST['widget_type']; $language = $_POST['language_support']; $description = $_POST['widget_description']; $dependencies = $_POST['widget_dependencies']; $sql_store = "INSERT INTO 'submissions' (ID, Author, Widget_Name, Widget_Type, Language_Support, Description, Dependencies, Icon) VALUES ('', '', '$name', '$type', '$language', '$description', '$dependencies', '')"; $sql = mysqli_query($db, $sql_store) or die(mysql_error()); } else {echo "<span class='enter-data' id='enter-data'>You need to enter data in all fields.</span>";} } else {echo "<span></span>";} /* if(isset($_POST['submit'])){ $iconName = mysql_real_escape_string($_FILES["image"]["name"]); $iconData = mysql_real_escape_string(file_get_contents ($_FILES["image"]["tmp_name"])); $imageType = mysql_real_escape_string($_FILES["image"]["type"]); if(substr($imageType,0,5) == "image"){ mysqli_query("INSERT INTO 'submissions' VALUES('','$ImageName','$imageData') ") } else {echo "Only images allowed.";} } */ ?> <!DOCTYPE html> <html> </head> <title>Test</title> <style> body{font-family:Helvetica;} span{margin-left:10; width:30%; display:inline-block;} input{margin-top:10; width: 60%;} #submission-form{float:left;} #text-inputs{width:500px; background:red; border-radius:15px; display:inline-block;} #image-upload{width:500px; background:blue; border-radius:15px; display:inline-block; vertical-align:top; height: 250; width: 250px;} .description-box{margin-top:10; min-width:60%; max-width:60%; height:100;} .dependencies-box{margin-bottom:10;} .submit-button{float:right; width:20%; margin-top:-10; margin-right:10;} input[type='file'] { color: transparent; } </style> <head> <body> <div id="submission-form"> <form action="index.php" method="POST" enctype="multipart/form-data"> <div id="image-upload"> <span style="width:auto; margin-top:10;">Widget Icon:</span> <input style="float:right; margin-right: -15;" type="file" name="widget_icon" onchange="loadFile(event)"> <center><img style="width: 80%; height: auto; margin-top:5;" src="http://placehold.it/500x500" id="output"></center> <script> var loadFile = function(event) { var output = document.getElementById('output'); output.src = URL.createObjectURL(event.target.files[0]); }; </script> </div> <div id="text-inputs"> <span>Widget Name: </span><input type="text" name="widget_name" value=""> <br> <span>Widget Type: </span><input type="text" name="widget_type" value=""> <br> <span>Language Support: </span><input type="text" name="language_support" value=""> <br> <span style="vertical-align:top; padding-top:10;}">Description: </span><textarea rows="1" cols="26" name="widget_description" value="" class="description-box"></textarea> <br> <span>Dependencies: </span><input type="text" name="widget_dependencies" value="" class="dependencies-box"> <br> </div> <br> <br> <input type="submit" name="submit_data" value="Submit" class="submit-button"> </form> </div> </body> </html> 的总概率,

---
- name: Install dependencies
  apt: name={{ item }} state=present update_cache=yes
  with_items:
    - linux-image-generic-lts-{{ ansible_distribution_release }}
    - linux-headers-generic-lts-{{ ansible_distribution_release }}
  become: true

有关MathJax的更完整说明,请参阅https://math.stackexchange.com/questions/2356/is-it-possible-to-split-coin-flipping-3-ways