这个问题是关于这个问题的评论
推荐的方法来初始化srand?第一条评论说srand()应该只在应用程序中调用ONCE.为什么会这样?
我注意到我的电脑上有一个奇怪的东西。*手写的可分性测试明显比%算子快。考虑最小的例子:
* AMD 锐龙 Threadripper 2990WX,GCC 9.2.0
static int divisible_ui_p(unsigned int m, unsigned int a)
{
if (m <= a) {
if (m == a) {
return 1;
}
return 0;
}
m += a;
m >>= __builtin_ctz(m);
return divisible_ui_p(m, a);
}
Run Code Online (Sandbox Code Playgroud)
该示例受奇数a和 的限制m > 0。然而,它可以很容易地推广到所有a和m。代码只是将除法转换为一系列加法。
现在考虑使用以下命令编译的测试程序-std=c99 -march=native -O3:
for (unsigned int a = 1; a < 100000; a += 2) {
for (unsigned int m …Run Code Online (Sandbox Code Playgroud) 似乎这个简单的shuffle算法会产生偏差的结果:
# suppose $arr is filled with 1 to 52
for ($i < 0; $i < 52; $i++) {
$j = rand(0, 51);
# swap the items
$tmp = $arr[j];
$arr[j] = $arr[i];
$arr[i] = $tmp;
}
Run Code Online (Sandbox Code Playgroud)
你可以尝试...而不是使用52,使用3(假设只使用3张卡),并运行10,000次并计算结果,你会看到结果偏向某些模式......
问题是......它会发生什么简单的解释?
正确的解决方案是使用类似的东西
for ($i < 0; $i < 51; $i++) { # last card need not swap
$j = rand($i, 51); # don't touch the cards that already "settled"
# swap the items
$tmp = $arr[j];
$arr[j] = $arr[i];
$arr[i] = $tmp; …Run Code Online (Sandbox Code Playgroud) 我有一个数字值数组,我想从该数组中随机选择一个值,然后将其插入到一个int变量中.
我不确定你需要看什么代码.所以,
这是for我用来生成13个数字(1-13)并将它们插入数组的循环.
int clubsArray [];
clubsArray = new int [13];
for(int i = 0; i < clubsArray.length; i++) {
clubsArray[i] = i +1;
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但现在我需要从该数组中选择2个随机值(然后将其插入到稍后要使用的变量中).
我在许多网站上环顾四周,我已经看到过ArrayList<String>将数值插入数组然后用于Random generator = new Random()从数组中选择值然后.remove()将其从数组中删除的事情.但是,当我使用它时,它不起作用.
我正在玩我在其他SO帖子(在下面的参考文献中列出)中找到的一对算法,并且我试图找出如何改进分发.我通过将位数加倍来有效地扩展随机数的范围,并且希望确保分布尽可能均匀,同时消除(或至少减少)模偏差和其他伪像对混洗算法的影响这将使用我修改的随机数生成器的结果.
所以,这是我的理解是,如果我初始化我RNG以恒定的种子(即:srand(1))我将与调用得到确定性的输出相同的模式rand()在一个for循环.现在,如果我要初始化我的种子srand(time(NULL)),它将是一个不同的模式,但它仍然可能无法解决以下问题:我试图弄清楚我是否要实现以下算法:
我能够:
a,b ? Z+ on [0, RAND_MAX](a并且b是零和RAND_MAX包含之间的正整数).虽然输出rand()应该是均匀分布的,但我不知道是否保证给出N次,N + 1次调用rand每个循环的值,并在随机序列重复之前给出每一对在点(1)中的列表本身又来了.我的新随机数生成器理论上可以生成随机值[0, RAND_MAX ^ 2],但我不知道在这个范围内是否有可能永远不会由我的算法生成的"漏洞".
我试图自己进一步研究这个问题,但是我无法找到有关rand()C中产生的随机序列持续多长时间的信息,直到它重复出现为止.缺乏这些和其他信息,我无法弄清楚是否有可能生成每一对(a,b).
那么,使用rand(),是否有可能实现第(1)点,如果是的话,是否有任何关于如何根据第(2)点优化其"随机性"的可靠建议?
感谢您的时间和帮助.
我后来重新讨论了这个问题并使用8位PRNG进行了模拟.虽然它确实可以生成所有可能的坐标对,但实际上分布非常有趣,并且绝对不均匀.最后,我阅读了几篇有关PRNG的文章/论文,并使用Mersenne Twiser算法生成所需的额外位(即MT19937-64).
参考
<https://stackoverflow.com/questions/9775313/extend-rand-max-range> <https://stackoverflow.com/questions/6127503/shuffle-array-in-c> 我正在尝试创建一些生成随机数组但没有重复值的东西.我已经看过其他答案,但似乎没有人帮助我理解.我想不出一种方法来实际生成不包含重复项的随机数.这是我到目前为止所尝试的:
srand(time(NULL));
int numbers [4];
for (int x=0; x!=4;x++)
{
numbers[x] = 1 + (rand() % 4) ;
printf("%d ", numbers[x]);
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.
我正在编写一个函数,该函数应该使用从0到n的随机数填充数组(其中n是传递给该函数的参数),但是数组中的所有数字都应该是唯一的。我基本上需要将数字数组从0改到n
我在这里找到了这个答案:用C编程语言在整数数组中的唯一随机数
并使用了用户建议的“ Knuth算法”:
void generate_random_array(int count)
{
int in, im;
im = 0;
srand(time(NULL));
for (in = 0; in < count && im < count; ++in) {
int rn = count - in;
int rm = count - im;
if (rand() % rn < rm) random_array[im++] = in;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,此函数根本不会为我生成随机数,它只是创建了一个从0到count的数字数组。如何生成唯一数字的实际随机序列。
我有一个有6个成员的结构.我想改组结构,所以当用户点击Enter键时,struct成员会随机打印出来,如下所示:
第一次:
Member3 - Member1
Member4 - Member6
Member5 - Member2
Run Code Online (Sandbox Code Playgroud)
第二次:
Member1 - Member6
Member3 - Member5
Member2 - Member4
Run Code Online (Sandbox Code Playgroud)
等等,只要用户点击Enter kyboard,成员就会随机播放.
这是我到目前为止:
int main(void) {
struct Members[] = {
{ "Member1", 0, 0, 0},
{ "Member2", 0, 0, 0},
{ "Member3", 0, 0, 0},
{ "Member4", 0, 0, 0},
{ "Member5", 0, 0, 0},
};
do
{
Shuffle(Members, 6)
}while(getch() != ESC);
}
Run Code Online (Sandbox Code Playgroud)
编辑:这是Fisher-Yates shuffle的一个很好的实现吗?
static int rand_int(int n)
{
int limit = RAND_MAX - RAND_MAX % n; …Run Code Online (Sandbox Code Playgroud) 所以问题是开发一个[5] [5]表,每个表包含1-100的唯一数字(没有重复)
所以这就是我提出的:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int outerLoop;
int innerLoop;
int board[5][5]; /* Array Name And Size*/
/* seeds the random number generator*/
srand(time(NULL));
int number;
number = rand() % 101;
/* Start a loop to generate a random integer between 1 and 100 and
assign it into the array. The loop runs 25 times*/
for ( outerLoop = 0 ; outerLoop <= 25 ; outerLoop++ ) /* loop 25 times*/
{ …Run Code Online (Sandbox Code Playgroud) 我编写了一个生成4个随机数字的程序,它应该出现在屏幕上,如下所示:从0000到9999(当然不是按升序排列!).
问题是我遇到过彼此相同的数字.我该如何解决?我只想生成10,000个数字,范围在0000到9999之间,但不是以任何顺序:只是"随机".
这是我到目前为止所写的内容:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
#define SIZE 10000
int main(){
srand(time(NULL));
int a[SIZE], b[SIZE], c[SIZE], d[SIZE], i;
FILE *fd = fopen("combinations_rand.txt", "w");
assert(fd);
for(i=0; i<SIZE; i++){
a[i] = rand()%10; //array of first digits
b[i] = rand()%10; //array of second digits, etc...
c[i] = rand()%10;
d[i] = rand()%10;
fprintf(fd, "%d%d%d%d\n", a[i], b[i], c[i], d[i]);
}
fclose(fd);
}
Run Code Online (Sandbox Code Playgroud) 这是我的代码.我正在尝试生成随机字母,但我看到相同的字母.例如:(Y HTGDHFBSHXCHF Y FUXZWDYKLXI)我该如何解决?只是我需要混合字母而不是相同的字母.非常感谢.
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void random_string(char * string, unsigned length)
{
/* Seed number for rand() */
srand((unsigned int) time(0));
int i;
for (i = 0; i < length; ++i)
{
string[i] = rand() % 26 + 'A';
}
string[i] = '\0';
}
int main(void)
{
char s[26];
random_string(s, 26);
printf("%s\n", s);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 所以我有一个家庭作业,我们需要在C中生成1到100之间的随机数。我有一个工作示例,其中int i = rand()%100; 但是根据技术上不正确的作业,我实际上并没有得到。作业说明如下
“ 1.1我们使用随机数发生器模拟公交车的到达时间。===> rand()函数。rand()函数将伪随机数0返回给RAND_MAX(在Linux中为2 ^ 31-1)。随机数rn,介于0.0到1.0之间; rn = rand()/ RAND_MAX。(顺便说一下,很多人在下面创建例如2位数的随机数。r_num = rand()%100;因为%100是0到99。但是,这是错误的。生成2位数随机数的正确方法是:将0-RAND_MAX分成10个间隔,看看随机数落在哪里。间隔时间为= RAND_MAX / 100。通过以下方式将其映射到0-99之一:0 1 2 3 .........99 0 it 2 * it 3 * it 99 * it到RAND_MAX如果rand()返回一个介于(12 * it)和(13 * it)之间的数字,则2位随机数为12。)“
我希望有人可以解释一下我说的是什么,我并不是真正在寻找代码示例,只是为了理解问题。