相关疑难解决方法(0)

在c中生成具有特定分布的随机数

我需要一个具有生成随机数,给定平均值,标准差和使用三种分布之一的函数的库 - 指数,正态或统一.

甚至连三个中的一个都会有所帮助.我正在寻找类似的东西 - http://www.codeproject.com/KB/recipes/zigurat.aspx,但是在c.

谢谢

c

11
推荐指数
2
解决办法
1640
查看次数

将 uint32_t 转换为 0 和 1 之间的 double

我有一个可耻幼稚的问题:什么是一个转换的最佳方式uint32_t,以一个double0和1之间?

我天真的方法是

double myconvert(uint32_t a)
{
    double n = static_cast<double>(std::numeric_limits<uint32_t>::max() - std::numeric_limits<uint32_t>::min());
    return static_cast<double>(a) / n;
}
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有更好的方法?

c++

8
推荐指数
3
解决办法
456
查看次数

非常快速的均匀分布随机数发生器

作为蒙特卡罗模拟的一部分,我必须滚动一组骰子,直到某些值出现一定次数.我执行此操作的代码调用一个dice类,它生成1到6之间的随机数,并返回它.最初的代码看起来像

public void roll() {
    value = (int)(Math.random()*6) + 1;
}
Run Code Online (Sandbox Code Playgroud)

它不是很快.通过交换Math.random()

ThreadLocalRandom.current().nextInt(1, 7);
Run Code Online (Sandbox Code Playgroud)

它在原始时间的大约60%中运行了一个部分,大约有2.5亿次.作为完整模拟的一部分,它至少会使用这种方法数十亿次,那么有没有更快的方法呢?

java random performance

6
推荐指数
1
解决办法
2385
查看次数

均匀分布:错误或悖论

想象一下10辆车随机,均匀分布在一个长度为1的圆形轨道上。如果位置用[0,1>范围内的C double表示,那么它们可以排序,车之间的间隙应该是车的位置前面减去后面汽车的位置。最后一个间隙需要添加 1 来解释不连续性。

在程序输出中,最后一列的统计数据和分布与其他列有很大不同。行正确地加到 1。这是怎么回事?

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int compare (const void * a, const void * b)
{
  if (*(double*)a > *(double*)b) return 1;
  else if (*(double*)a < *(double*)b) return -1;
  else return 0;
}

double grand_f_0_1(){
  static FILE * fp = NULL;
  uint64_t bits;

  if(fp == NULL) fp = fopen("/dev/urandom", "r");
  fread(&bits, sizeof(bits), 1, fp);
  return (double)bits * 5.421010862427522170037264004349e-020; // https://stackoverflow.com/a/26867455
}

int main()
{
  const int n = 10;
  double values[n];
  double diffs[n]; …
Run Code Online (Sandbox Code Playgroud)

c random debugging paradox uniform-distribution

6
推荐指数
1
解决办法
129
查看次数

通用随机数生成

C++ 11为C推出了一个非常优越的随机数库rand().在C中,您经常会看到以下代码:

srand(time(0));
rand() % MAX + MIN;
Run Code Online (Sandbox Code Playgroud)

因为time(0)以秒为单位返回当前时间,所以对程序的快速连续调用将产生相同的数字序列.对此的快速解决方法是在纳秒内提供种子:

 struct timeval time; 
 gettimeofday(&time,NULL);
 srand((time.tv_sec * 1000) + (time.tv_usec / 1000));
Run Code Online (Sandbox Code Playgroud)

当然,这并没有改变rand()普遍被认为是坏的和优越的替代品要么不可移植(如Linux random())或依赖第三方库(如Boost)的事实.

在C++ 11中,我知道产生良好随机数的最短程序是:

#include <iostream>
#include <random>

int main()
{
    std::random_device rd;
    std::mt19937 mt(rd());
    std::uniform_int_distribution<int> dist(1, 10);
    std::cout << dist(mt);
}
Run Code Online (Sandbox Code Playgroud)

std::random_device是不便携的,std::default_random_engine因为它可能会选择一个糟糕的引擎,例如std::rand.实际上,由于这个原因,std::random_shuffle它已被弃用并且std::shuffle是首选.一般来说,我看到有人说使用计时器提供种子代替:

std::chrono::high_resolution_clock::now().time_since_epoch().count()
Run Code Online (Sandbox Code Playgroud)

这不仅难以记住,而且当我们想要使用纳秒时看起来更加丑陋:

using namespace std::chrono;
std::mt19937 mt(duration_cast<nanoseconds>(high_resolution_clock::now()
                                      .time_since_epoch()).count());
Run Code Online (Sandbox Code Playgroud)
  • C方法看起来很理想,因为它不需要那么多的样板.

  • random_device 是最容易的,因为它不需要丑陋的单行,即使它是不便携的.

  • mt19937比记忆更难记住default_random_engine.

哪种方法最好?

c++ random c++11

5
推荐指数
1
解决办法
1154
查看次数

如何在C++中以高精度生成随机双数?

我正在尝试以高精度生成一系列双随机数。例如,0.856365621(十进制后有 9 位)。

我从互联网上找到了一些方法,但是,它们确实生成了双随机数,但是精度没有我要求的那么好(小数点后只有 6 位)。

因此,我可以知道如何实现我的目标吗?

c++ random precision

4
推荐指数
1
解决办法
3107
查看次数

如何使用 rand() 创建随机双精度数?

为了生成随机双精度数,有 drand48,但是

这些函数被 SVID 3 声明为过时,其中规定应使用 rand(3) 代替。

如何使用 drand48 构建随机双精度?顺便说一句,随机浮动?

简单地连接两个intfromrand()并进行强制转换可能会导致 NaN,这是不可接受的。我想避免仅使用 32 个随机位作为双精度数。

c random double

0
推荐指数
1
解决办法
380
查看次数