Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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
C 不同权重的随机分布规划_C_Algorithm_Random_Pseudocode - Fatal编程技术网

C 不同权重的随机分布规划

C 不同权重的随机分布规划,c,algorithm,random,pseudocode,C,Algorithm,Random,Pseudocode,我要说的第一件事是,这类问题可能有一个名字,我只是不知道它的名字 解释如下: 有8个球槽和100个球随机分布在槽之间。有3种不同类型的插槽:红色、绿色和蓝色。红色插槽类型必须至少总共有6个球,绿色15个和蓝色不重要 除了每种不同颜色所需的数量外,还可能有多个红色、绿色或蓝色插槽,每个插槽都有相同比例的球进入其中。红色是4%,绿色是15%,蓝色是其余未采摘的 所以随机建议一个序列这是一种可能性: Slot 1 - Blue with 17 balls Slot 2 - Green with 8 b

我要说的第一件事是,这类问题可能有一个名字,我只是不知道它的名字

解释如下:

有8个球槽和100个球随机分布在槽之间。有3种不同类型的插槽:红色、绿色和蓝色。红色插槽类型必须至少总共有6个球,绿色15个和蓝色不重要

除了每种不同颜色所需的数量外,还可能有多个红色、绿色或蓝色插槽,每个插槽都有相同比例的球进入其中。红色是4%,绿色是15%,蓝色是其余未采摘的

所以随机建议一个序列这是一种可能性:

Slot 1 - Blue with 17 balls
Slot 2 - Green with 8 balls
Slot 3 - Green with 12 balls
Slot 4 - Red with 1 ball
Slot 5 - Blue with 33 balls
Slot 6 - Red with 7 balls
Slot 7 - Blue with 12 balls
Slot 8 - Green with 10 balls
请注意,所需的数量已经填满,并且还有多个红色和绿色插槽,尽管它只需要一个(至少有一个球在里面)

我需要的是一个伪代码或任何语言的代码,显示如何在不同的插槽和不同的权重之间分配所有100个球。我一直在为它编程,但每3分一次,就有一次没能分配到每一个球,它错过了一些

--编辑: 我用C#编写的代码的草图(这只是彩色插槽生成):

int-amountofreeslots=0,amountOfGreenSlots=0,amountOfBlueSlots=0;
int[]slotColors=新int[8]//1-红色,2-绿色,3-蓝色;
对于(int i=0;i<8;i++)
{
int num=Random.Range(1011);

如果(num类似的东西可以工作,那么这是一个快速代码,因此可能会有一两个错误。请注意您所说的内容,尽管当前布局存在较低的可能性,但您可能会超过要分发的球数。例如:6个绿色和2个红色

这是密码

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

enum types{RED=1,BLUE,GREEN};

typedef struct 
{
    int color;
    unsigned int number_balls;
}slot_t;


#define NUM_SLOTS 8
#define GREEN_PROBABILITY 15
#define RED_PROBABILITY 4

#define MINIMUM_RED 6
#define MAX_NUMBER_BALLS 100
int main(void)
{
    slot_t slots[NUM_SLOTS];
    int slots_created,random_number;
    int ball_count=0;
    srand(time(NULL));
    for(slots_created=0;slots_created<NUM_SLOTS;slots_created++ )
    {
        random_number=rand()%100+1;//random value between 1-100
        if(random_number<=RED_PROBABILITY){
            slots[slots_created].color=RED;
            slots[slots_created].number_balls=MINIMUM_RED;
            ball_count+=MINIMUM_RED;

        }
        else if(random_number<=GREEN_PROBABILITY+RED_PROBABILITY)
        {
            slots[slots_created].color=GREEN;
            slots[slots_created].number_balls=MINIMUM_RED;
            ball_count+=MINIMUM_RED;
        }
        else if(random_number<=GREEN_PROBABILITY)
            ;//blue case
    }   

    while(ball_count<MAX_NUMBER_BALLS)
    {
        slots[rand()%NUM_SLOTS].number_balls+=1; //add one ball
        ++ball_count;
    }


} 
#包括
#包括
#包括
枚举类型{RED=1,BLUE,GREEN};
类型定义结构
{
内色;
无符号整数球;
}槽t;
#定义NUM_插槽8
#定义绿色概率15
#定义红色概率4
#定义最小的红色6
#定义最大球数为100
内部主(空)
{
插槽t插槽[插槽数量];
创建int槽,随机数;
int ball_count=0;
srand(时间(空));

对于(slot_created=0;slot_created这样的代码应该可以工作,这是一个快速代码,因此可能会有一两个错误。请注意您所说的内容,尽管当前布局存在很低的可能性,但您可能会超过要分发的球数。例如:6个绿色和2个红色

这是密码

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

enum types{RED=1,BLUE,GREEN};

typedef struct 
{
    int color;
    unsigned int number_balls;
}slot_t;


#define NUM_SLOTS 8
#define GREEN_PROBABILITY 15
#define RED_PROBABILITY 4

#define MINIMUM_RED 6
#define MAX_NUMBER_BALLS 100
int main(void)
{
    slot_t slots[NUM_SLOTS];
    int slots_created,random_number;
    int ball_count=0;
    srand(time(NULL));
    for(slots_created=0;slots_created<NUM_SLOTS;slots_created++ )
    {
        random_number=rand()%100+1;//random value between 1-100
        if(random_number<=RED_PROBABILITY){
            slots[slots_created].color=RED;
            slots[slots_created].number_balls=MINIMUM_RED;
            ball_count+=MINIMUM_RED;

        }
        else if(random_number<=GREEN_PROBABILITY+RED_PROBABILITY)
        {
            slots[slots_created].color=GREEN;
            slots[slots_created].number_balls=MINIMUM_RED;
            ball_count+=MINIMUM_RED;
        }
        else if(random_number<=GREEN_PROBABILITY)
            ;//blue case
    }   

    while(ball_count<MAX_NUMBER_BALLS)
    {
        slots[rand()%NUM_SLOTS].number_balls+=1; //add one ball
        ++ball_count;
    }


} 
#包括
#包括
#包括
枚举类型{RED=1,BLUE,GREEN};
类型定义结构
{
内色;
无符号整数球;
}槽t;
#定义NUM_插槽8
#定义绿色概率15
#定义红色概率4
#定义最小的红色6
#定义最大球数为100
内部主(空)
{
插槽t插槽[插槽数量];
创建int槽,随机数;
int ball_count=0;
srand(时间(空));

对于(slots\u created=0;slots\u created能否显示您当前尝试的代码?堆栈溢出不是一种代码编写服务。我确实理解您的说法,我说过代码需要,但我真正需要的只是一些解决方案的指导,也许是一些步骤。我编写的代码有200多行,非常不优化。我不理解关于多个红色和绿色插槽类型的要求。必须有一个红色插槽,因此插槽为红色的概率必须至少为12.5%,这远远超过4%。我不明白您从中提取了12.5%,但解释是:因为红色插槽中至少需要6个球,所以必须至少有一个,但not必须是唯一的。你能展示你目前尝试过的代码吗?堆栈溢出不是一种代码编写服务。我确实理解你的说法,我说过需要代码,但我真正需要的只是一些解决方案的指导,也许是一些步骤。我编写的代码有200多行,非常不优化。我不理解这些代码关于多个红色和绿色插槽类型的要求。必须有一个红色插槽,因此插槽为红色的概率必须至少为12.5%,这远远超过4%。我不明白您从何处获得了12.5%,但解释是:因为红色插槽中至少需要6个球,所以必须至少有一个,但不是必须只有一个。谢谢你的回答,但要注意一些事情:你没有强制要求红色或绿色的数量,你只是说如果它碰巧产卵,把那么多的球放进去,而且红色/绿色插槽内的球的数量不是强制性的6/15,这个数量是作为红色/绿色插槽内的球总数需要的,不是吗还有一件事,“剩下的”球你只是将它随机放入一个有颜色的槽中,你没有考虑到这个球也有进入一个有颜色槽的速率。谢谢你的回答,但是要注意一些事情:你没有强迫红色或绿色的数量,你只是说如果它碰巧产卵,把那么多的球放进去,还有红色/g中的球的数量reen插槽不是强制要求的6/15,这个数量是作为红色/绿色插槽中的球的总数,而不是单个插槽中的球。还有一件事,“剩余”的球你只是在插槽中随机分配,你没有考虑到球也有进入彩色插槽的速率。