Random类有一个在给定范围内生成随机int的方法.例如:
Random r = new Random();
int x = r.nextInt(100);
Run Code Online (Sandbox Code Playgroud)
这将产生一个大于等于0且小于100的int数.我想用长数做同样的事.
long y = magicRandomLongGenerator(100);
Run Code Online (Sandbox Code Playgroud)
Random类只有nextLong(),但它不允许设置范围.
使用.NET随机化字符串数组的最佳方法是什么?我的数组包含大约500个字符串,我想Array用随机顺序创建一个具有相同字符串的新字符串.
请在答案中加入C#示例.
是什么区别Math.random() * n和Random.nextInt(n)在那里n是一个整数?
我有两个双打,如下所示
double min = 100;
double max = 101;
Run Code Online (Sandbox Code Playgroud)
并且使用随机生成器,我需要在min和max的范围之间创建一个double值.
Random r = new Random();
r.nextDouble();
Run Code Online (Sandbox Code Playgroud)
但是这里没有任何东西我们可以指定范围.
正如标题所示,我试图找出一种使用新的C++ 11 <random>库生成随机数的方法.我用这段代码尝试过:
std::default_random_engine generator;
std::uniform_real_distribution<double> uniform_distance(1, 10.001);
Run Code Online (Sandbox Code Playgroud)
我的代码的问题是,每次编译和运行它时,它总是生成相同的数字.所以我的问题是随机库中的其他函数可以在真正随机的情况下实现这一点吗?
对于我的特定用例,我试图获得该范围内的值 [1, 10]
我用他的JavaScript代码帮助了一个人,我的眼睛被一个看起来像这样的部分抓住了:
function randOrd(){
return (Math.round(Math.random())-0.5);
}
coords.sort(randOrd);
alert(coords);
Run Code Online (Sandbox Code Playgroud)
我的第一个是:嘿,这不可能奏效!但后来我做了一些实验,发现它确实至少似乎提供了很好的随机结果.
然后我做了一些网络搜索,几乎在顶部发现了一篇文章,这段代码最简单地被复制.看起来像一个相当可敬的网站和作者......
但我的直觉告诉我,这一定是错的.特别是因为ECMA标准没有规定排序算法.我认为不同的排序算法会导致不同的非均匀混洗.一些排序算法甚至可能无限循环...
但你怎么看?
而另一个问题是......现在我将如何衡量这种改组技术的结果是多么随机?
更新:我做了一些测量并将结果发布在下面作为答案之一.
我一直认为随机数在0和1之间,没有1,即它们是来自半开区间[0,1]的数字.cppreference.com上的文件std::generate_canonical证实了这一点.
但是,当我运行以下程序时:
#include <iostream>
#include <limits>
#include <random>
int main()
{
std::mt19937 rng;
std::seed_seq sequence{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
rng.seed(sequence);
rng.discard(12 * 629143 + 6);
float random = std::generate_canonical<float,
std::numeric_limits<float>::digits>(rng);
if (random == 1.0f)
{
std::cout << "Bug!\n";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它给了我以下输出:
Bug!
Run Code Online (Sandbox Code Playgroud)
即它1会让我产生完美,这会导致我的MC集成出现问题.是有效行为还是我身边有错误?这给出了与G ++ 4.7.3相同的输出
g++ -std=c++11 test.c && ./a.out
Run Code Online (Sandbox Code Playgroud)
和铿锵3.3
clang++ -stdlib=libc++ -std=c++11 test.c && ./a.out
Run Code Online (Sandbox Code Playgroud)
如果这是正确的行为,我该如何避免1?
编辑1:来自git的G ++似乎遇到了同样的问题.我在 …
我在 C 中实现了一个 hashmap 作为我正在处理的项目的一部分,并使用随机插入来测试它。我注意到rand()在 Linux 上似乎比在 Mac 上更频繁地重复数字。RAND_MAX是2147483647/0x7FFFFFFF两个平台上。我将它简化为这个测试程序,该程序RAND_MAX+1生成一个长字节数组,生成RAND_MAX随机数,注意每个数字是否重复,并将其从列表中检查出来,如所见。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main() {
size_t size = ((size_t)RAND_MAX) + 1;
char *randoms = calloc(size, sizeof(char));
int dups = 0;
srand(time(0));
for (int i = 0; i < RAND_MAX; i++) {
int r = rand();
if (randoms[r]) {
// printf("duplicate at %d\n", r);
dups++;
}
randoms[r] = 1;
}
printf("duplicates: %d\n", dups);
}
Run Code Online (Sandbox Code Playgroud)
Linux 始终生成大约 …
假设我有一个n侧加载的模具,当我滚动它时,每个侧面k都有一些概率p k.我很好奇是否存在静态存储此信息的良好算法(即,对于一组固定的概率),以便我可以有效地模拟模具的随机滚动.
目前,我有一个针对此问题的O(lg n)解决方案.想法是存储所有k的前k个边的累积概率的表,它们生成范围[0,1)中的随机实数并且对表执行二元搜索以获得其累积的最大索引值不大于所选值.我更喜欢这个解决方案,但运行时没有考虑概率似乎很奇怪.特别是,在一方总是出现或值均匀分布的极端情况下,可以使用朴素的方法在O(1)中生成滚动的结果,尽管我的解决方案仍然需要采用多个步骤的对数.
有没有人对如何以某种方式在运行时"自适应"的方式解决这个问题有任何建议?
编辑:基于这个问题的答案,我写了一篇文章,描述了这个问题的许多方法,以及他们的分析.看起来Vose的别名方法的实现给出了Θ(n)预处理时间和每次掷骰的O(1)时间,这确实令人印象深刻.希望这是对答案中包含的信息的有用补充!
language-agnostic random algorithm probability data-structures
我正在使用此行为node.js生成sha1 id:
crypto.createHash('sha1').digest('hex');
Run Code Online (Sandbox Code Playgroud)
问题是它每次都返回相同的id.
是否可以让它每次生成一个随机ID,以便我可以将它用作数据库文档ID?