Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 由偏态正态分布生成随机数_Php_Javascript_Ruby - Fatal编程技术网

Php 由偏态正态分布生成随机数

Php 由偏态正态分布生成随机数,php,javascript,ruby,Php,Javascript,Ruby,在大多数语言中使用random(min,max)函数时,分布是什么样的 如果我想在20%的时间里产生一个数字范围,在80%的时间里产生另一个数字范围,我怎么能产生一系列随机数呢 ex)我应该得到随机频率,但“1”的频率必须比“0”的频率高出约20%大多数计算机语言的(伪)随机整数生成器具有均匀分布。所以每个整数的可能性相等 例如,假设您需要55%的时间为“1”,45%的时间为“0” 要获得不相等的频率,请尝试生成1到100之间的随机数。如果生成的数字为1到55,则输出“1”;否则,输出“0”。大

在大多数语言中使用random(min,max)函数时,分布是什么样的

如果我想在20%的时间里产生一个数字范围,在80%的时间里产生另一个数字范围,我怎么能产生一系列随机数呢


ex)我应该得到随机频率,但“1”的频率必须比“0”的频率高出约20%

大多数计算机语言的(伪)随机整数生成器具有均匀分布。所以每个整数的可能性相等

例如,假设您需要55%的时间为“1”,45%的时间为“0”


要获得不相等的频率,请尝试生成1到100之间的随机数。如果生成的数字为1到55,则输出“1”;否则,输出“0”。

大多数内置编程语言的伪随机生成器产生均匀分布,即范围内的每个值产生的概率与范围内的任何其他值相同。事实上,在某些情况下,这一要求是语言标准的一部分。有些语言(如Python或R)支持各种常见的发行版

如果该语言不支持它,则必须使用数学技巧从统一分布生成其他分布,例如正态分布,或者可以寻找执行此功能的第三方库

然而,您的问题似乎简单得多,因为随机变量是离散的(以及更简单的类型,即二进制)。其诀窍是从均匀分布中产生一个给定范围内的随机数,比如0到999,并将该范围按与每个值相关的比例进行分割,在本例中,这类似于:

  If (RandomNumber) < 200    // 20%
     RandomVariable = 0
  Else                       // 80%
     RandomVariable = 1
If(随机数)<200//20%
随机变量=0
其他//80%
随机变量=1

这种逻辑当然可以应用于n个离散变量。

对于大多数语言,生成的随机数可能取决于该语言中的算法,也可能是基于时间、处理器、种子数等几个因素随机生成的

分布不正常。事实上,如果函数返回5个整数,那么所有5个整数都有可能出现在下一个函数调用中。这也称为均匀分布

因此,假设您希望在20%的时间内生成一个数字(比如7),在80%的时间内生成另一个数字(比如13),您可以这样做:

var arr = [7,13,13,13,13];
var picked = arr[Math.floor(Math.random()*arr.length)] ; 
// since Math.random() returns a float from 0.0 to 1.0
class DistributedRandom
  def initialize(left, right = nil)
    if right
      @distribution = [0] * left + [1] * right
    else
      @distribution = left
    end
  end
  def get
    @distribution[rand @distribution.length]
  end
end

因此,7有20%的几率出现,13有80%的几率出现。

这是一种可能的方法:

ranges = [(10..15), (20..30)]
selector = [0, 0, 1,1,1,1,1,1,1,1] # 80:20 distribution array

# now select a range randomly    
random_within_range(ranges(selector[random(10)]))  


def random_within_range range
  rand (range.last - range.begin - (range.exclude_end? ? 1 : 0)) + range.begin
end
怎么样

var oneFreq = 80.0/100.0;
var output = 0;
if (Math.random() > oneFreq)
   output = 1;
或者,如果希望20%的值介于0和100之间,80%的值介于100和200之间

var oneFreq = 80.0/100.0;
var oneRange  = 100;
var zeroRange = 100;
var output = Math.random();
if (output > oneFreq)
   output = zeroRange + Math.floor(oneRange * (output - oneFreq));
else
   output = Math.floor(zeroRange * output);

你的问题与你的例子大不相同。所以我会回答这两个问题,你可以找出你真正想要的答案

1) 你的例子(我不懂ruby或java,请耐心听我说)

  • 首先从0到1的均匀分布生成一个随机数,我们称之为X
  • 然后可以设置if/else(即if(x<0.2){1}else{0})
2) 从具有偏斜的正态分布生成随机数

  • 您可以查看倾斜分布,例如具有高度自由度的倾斜student T分布
  • 您也可以使用普通的CDF,这样就可以选择数字
  • 下面是一个讨论如何使用均匀分布中的多个随机数执行此操作的示例
  • 最后,您可以使用非参数方法,这将涉及到核密度估计(我怀疑您没有寻找任何如此复杂的东西)

如果你想很好地理解数学,请看一看。

在ruby中,我会这样做:

var arr = [7,13,13,13,13];
var picked = arr[Math.floor(Math.random()*arr.length)] ; 
// since Math.random() returns a float from 0.0 to 1.0
class DistributedRandom
  def initialize(left, right = nil)
    if right
      @distribution = [0] * left + [1] * right
    else
      @distribution = left
    end
  end
  def get
    @distribution[rand @distribution.length]
  end
end
使用80:20的分布运行测试:

test = [0,0]
rnd = DistributedRandom.new 80, 20   # 80:20 distribution
10000.times { test[rnd.get] += 1 }; puts "Test 1", test
在右侧多运行20%的分布的测试:

test = [0,0]
rnd = DistributedRandom.new 100, 120   # +20% distribution
10000.times { test[rnd.get] += 1 }; puts "Test 2", test
使用超过91个离散值的三角函数使用自定义分布运行测试,但输出与以前的测试不太匹配:

test = [0,0]
rnd = DistributedRandom.new((0..90).map {|x| Math.sin(Math::PI * x / 180.0)})
10000.times { test[rnd.get] += 1 }; puts "Test 3", test

正如任何人所说,大多数语言上的伪随机数生成器实现了(0,1)上的均匀分布。 如果您有两个p概率为1的响应类别(0,1),那么您有一个伯努利分布,可以用

#  returns 1 with p probability and 0 with (1-p) probability
def bernoulli(p)
rand()<p ? 1:0;
end
获得cdf是困难的,因为没有解析解,所以你应该积分。
要从歪斜正态分布中获得随机数,可以使用该算法。

PS:“正态”分布与均匀分布不同。链接是死的,相关性也无法解释。