在一个范围和一个特定步骤内用C生成随机数

在一个范围和一个特定步骤内用C生成随机数,c,random,C,Random,好的,很可能它会被标记为重复,但我正在寻找答案,但找不到类似的东西。 问题是:我想生成特定范围内的随机数[即,从最小值到最大值]以及特定步骤。第一部分的答案是: int random_value = rand() % max_value + min_value; 步骤如何定义?我假设上述解决方案会导致步骤1。对的例如,如果我想通过步骤2生成数字(例如,2,4,…,16),我应该怎么做 这应该满足您的要求: int GetRandom(int max_value, int min_value,

好的,很可能它会被标记为重复,但我正在寻找答案,但找不到类似的东西。 问题是:我想生成特定范围内的随机数[即,从最小值到最大值]以及特定步骤。第一部分的答案是:

int random_value = rand() % max_value + min_value;

步骤如何定义?我假设上述解决方案会导致步骤1。对的例如,如果我想通过步骤2生成数字(例如,2,4,…,16),我应该怎么做

这应该满足您的要求:

int GetRandom(int max_value, int min_value, int step)
{
    int random_value = (rand() % ((++max_value - min_value) / step)) * step + min_value;
    return random_value;
}
你的“第一步”是不明智的,因为它会受到影响

引入“步长”是一个简单的算术问题,您可以在较小的范围内生成一个随机数
min\u value/step
max\u value/step
,然后将其乘以所需的步长(
random\u value*step

因此:

#包括
#包括
int随机范围(int最小值,int最大值)
{
//修理我
返回rand()%max\u值+min\u值;
}
整数随机范围步长(整数最小值、整数最大值、整数步长)
{
返回随机范围(最小值/步、最大值/步)*步;
}
...
//(例如2、4、…、16)
int random_value=随机范围_步长(2,16,2);

rand()
step
?最好告诉我们你想做什么,因为这似乎是一个xy问题。Stefano Sanfilippo乘你失去了最小值这一步是否意味着值可以被stepUnicell整除我不确定我没有解释清楚什么。对于程序的某些参数,我有许多可能的值。例如,一个参数可以在步骤1中取值0到9,在步骤2中取值24到44。在每次迭代中,我想随机选取参数值。第一个很简单。第二个让我很困惑。这是可行的,但它排除了max_值。例如,如果我希望在步骤2中的值为24到44,则不包括44。我知道解决这个问题很容易(定义46而不是44),但这会让人困惑bracket@kat实际上,您应该能够首先增加maxvalue。是的,这是一个选项。感谢您的有效性。如果
(++max\u值-min\u值)
不是
步骤的倍数,则除了@Nisse Engström提到的偏差外,还会发生偏差。但是OP不清楚这种情况下的要求。谢谢Clifford的帮助。你已经用除法运算符替换了模运算符。正如你链接到的那篇文章所解释的那样,这并不能消除偏见。@NisseEngström:我对此很粗心。我已将解决方案更改为使用
rand()/rand_MAX
商,但重新排列以避免浮点数,并对中间值使用更大的类型,因此它将适用于整个rand_MAX范围。还固定了从最小值到最大值(含)的范围。这比链接中建议的解决方案以及我的初衷都要简单。我确信存在一个一个接一个的问题。考虑<代码>随机范围(0,RANDMAX)< /代码>。代码应该是../(RAND_MAX+1)而不是../RAND_MAX@NisseEngström,因为它不是问题的一部分,可能会分散注意力,我把它作为一个注释,为了简单起见,使用了有缺陷的原始代码。(也就是说,我放弃了!解决方案在其他地方都有很好的记录)。
#include <stdint.h>
#include <stdlib.h>
int random_range( int min_value, int max_value )
{
    // Fix me
    return rand() % max_value + min_value;
}

int random_range_step(  int min_value, int max_value, int step )
{
    return random_range( min_value / step, max_value / step ) * step ;
}

...

//  (e.g. 2, 4, ..., 16)
int random_value = random_range_step( 2, 16, 2 ) ;