【问题标题】:Coin flips with single or multi-factor solving algorithms? [closed]用单因素或多因素求解算法抛硬币? [关闭]
【发布时间】:2018-06-30 23:03:38
【问题描述】:

是使用抛硬币来生成从 1 到 9 的随机整数,使用单因素求解算法更快,还是使用多因素求解算法计算更快?

使用一次因式分解求解,将处理具有四个 f(2) 实例的求解尝试,对于四位/进程返回,其函数范围为 2^4=16。对于根据该方法使用 f(2) 生成从 1 到 9 的 int,16 个结果中有 9 个是有效的,并且每次求解尝试的 7 个可能返回将是求解尝试失败/重试。因此,这种从 1 到 9 生成 rand 整数的单因式分解方法具有 7/16=%44 的四进程函数求解尝试失败/重试率。

在算法上使用多个因素,相对而言,求解尝试失败/重试率可能会降低?

首先,f(2) 的两个实例可以生成一个从 1 到 4 的随机整数,只接受从 1 到 3 的返回值,对于两个进程求解尝试函数,求解尝试失败/重试率为 %25。

接下来,f(2) 的另外两个实例可以生成另一个从 1 到 4 的随机整数,只接受从 1 到 3 的返回,另外 %25 的两个进程求解尝试函数的求解尝试失败/重试率。

从 1 到 3 的第一个 rand int 可以添加到 {3* ((the second rand int from 1 to 3 result)-1)} 以产生一个从 1 到 9 的 rand int,它有 %25 失败/retry rate 用于解决其前两个进程的尝试,然后是 %25 的失败/重试率用于解决其后两个进程的尝试。

第二种算法的f(2) -> f(9)求解效率可能更高,因为它使用了多个因子,而不是单个因子?

有关通过抛硬币创建随机数生成器的讨论,请参阅Creating a random number generator from a coin toss

【问题讨论】:

  • 您应该对此类内容进行概要分析,以便获得经验证据。

标签: algorithm random


【解决方案1】:

平均而言,“多因素”方法肯定需要更少的随机位。

我将在下面给出一个完整的计算,但要直观地了解原因,请考虑以下几点:

  • 在单因素方法中,每组四个位有 9/16 的机会给出有效结果;如果失败,您必须重新开始。
  • 在双因素方法中,每组四个位(= 两对两个位)有 9/16 的机会给出完整的有效结果(= 两个有效因素);但即使它失败了,它也有可能至少取得了一些进展,以后可以重复使用。

所以从某种意义上说,双因素方法有两条“成功之路”:

  • 一组成功的四位。
  • 四个位的半成功集,然后是另一个半成功集。

而单因​​素方法只有第一条路径。


现在,进行一些数学运算。 . .

当一个给定的 Trial 有成功的概率 p,并且所有的 Trial 都是独立的,那么直到一次成功的预期 Trial 次数是 1/p

此外,如果直到 one 成功之前的预期试验次数是 N,那么直到 m 成功之前的预期试验次数是 mN.

因此:

  • 当您的试验是“获得四个随机位”并且您对成功的定义是“结果在 1 到 9 之间”时,您可以预期需要 16/9 次试验,这意味着 4·16/9 = 64/9 ≈ 7.11 随机位,在您得到结果之前。
  • 当您的试验是“获得两个随机位”时,您对成功的定义是“结果在 1 和 3 之间”,并且您需要成功两次,那么您可以预期需要 2 ·4/3 = 8/3 次试验,意味着 2·8/3 = 16/3 ≈ 5.33 个随机位,然后才能得到结果。

下面是一些可运行的 JavaScript,它尝试了这两种方法 10,000 次,并根据平均位数和试验次数对它们进行了比较。 (当然,因为它调用Math.random() 来获取每一位,所以它是“不现实的”,因为它要求一堆随机位然后丢弃其中的大部分。我仅将其作为数学概念证明,而不是实现这两种方法的实际示例代码。)

alert((function () {

var totalNumBitsEverGotten = 0;

function getBit() {
  ++totalNumBitsEverGotten;
  return Math.random() < 0.5 ? 0 : 1;
}

function getNBits(n) {
  var result = 0;
  for (var i = 0; i < n; ++i) {
    result = 2 * result + getBit();
  }
  return result;
}

function getIntInRange(min, max) {
  if (min != 0) {
    return getIntInRange(0, max - min) + min;
  }
  var numBitsNeeded = 0;
  for (var tmp = max; tmp > 0; tmp >>= 1) {
    ++numBitsNeeded;
  }
  while (true) {
    var nBits = getNBits(numBitsNeeded);
    if (nBits <= max) {
      return nBits;
    }
  }
}

function countBitsToGet1To9_approach1() {
  var numBitsPreviouslyGotten = totalNumBitsEverGotten;
  getIntInRange(1, 9);
  return totalNumBitsEverGotten - numBitsPreviouslyGotten;
}

function countBitsToGet1To9_approach2() {
  var numBitsPreviouslyGotten = totalNumBitsEverGotten;
  getIntInRange(1, 3);
  getIntInRange(1, 3);
  return totalNumBitsEverGotten - numBitsPreviouslyGotten;
}

var NUM_TRIALS = 10000;

var approach1Sum = 0;
var approach2Sum = 0;

var approach1Wins = 0;
var approach2Wins = 0;

for (var i = 0; i < NUM_TRIALS; ++i) {
  var approach1 = countBitsToGet1To9_approach1();
  var approach2 = countBitsToGet1To9_approach2();

  approach1Sum += approach1;
  approach2Sum += approach2;

  if (approach1 < approach2) {
    ++approach1Wins;
  } else if (approach2 < approach1) {
    ++approach2Wins;
  }
}

return 'After ' + NUM_TRIALS + ' trials:\n' +
       '- Approach #1 average: ' + (approach1Sum / NUM_TRIALS) + ' bits.\n' +
       '- Approach #2 average: ' + (approach2Sum / NUM_TRIALS) + ' bits.\n' +
       '- Approach #1 was faster in ' + approach1Wins + ' trial(s).\n' +
       '- Approach #2 was faster in ' + approach2Wins + ' trial(s).\n' +
       '- The two approaches tied in ' + (NUM_TRIALS - approach1Wins - approach2Wins) + ' trial(s).\n';

})());

【讨论】:

  • 对我来说看起来像是一个组合数学问题,我需要研究它以发表意见,所以现在我将按照你的数学计算,将估计的 5.33 随机位与 7.11 位进行比较,比较算法计算时间。根据我的直觉,你的数字看起来可能是对的? Re你的“但即使它失败了,它也有可能至少取得了一些以后可以重用的进展”:我不知道这个?我认为每次求解尝试输出都需要有平等的机会获得随机性?因此,每次失败,都不能重用任何位,并且必须完全重试?谢谢!
  • @NikhBeghzr:由于每个两位“试验”的“成功”仅取决于该试验,因此无需像您描述的那样施加限制;无论它们是否相邻,您都可以安全地使用前两个成功的试验。但是,如果您确实施加了这样的限制,那么您问题中的两种方法就变得等价了-唯一的区别在于它们如何将四位序列映射到整数-并且它们都需要相同的预期位数。
  • 我不同意它们是等价的,因为我认为多因素方法不会达到处理/计算/尝试两个不成功的两位试验的程度:它会停止处理在前两位失败后重试?所以有时候多因素算法只需要 2 位来检测失败重试,而不是计算额外的 2 位,而单因素算法总是需要尝试 4 位来检测失败或获得成功返回?跨度>
  • @NikhBeghzr:如果您可以丢弃前两位但使用后两位,那么您为什么不同意使用前两位但丢弃后两位?跨度>
  • 我的评论/回复太长,所以我链接它:plus.google.com/113366929351507812798/posts/cMMttwP9g67
猜你喜欢
  • 1970-01-01
  • 2020-07-24
  • 2010-11-16
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
  • 2013-07-20
  • 2015-06-19
相关资源
最近更新 更多