C 是否可以生成一个随机字符串,其中的字符频率是固定的?

C 是否可以生成一个随机字符串,其中的字符频率是固定的?,c,random,C,Random,我试图生成随机字符串,每个字符的出现次数是固定的。例如-G(字符串中的一个字符),不能出现超过4次,S,不超过2次,依此类推。我的代码能够生成字符串,但不能解决字符频率的问题 有什么办法可以解决这个问题吗?任何帮助都将不胜感激 我目前的代码如下: #include<stdio.h> #include<stdlib.h> //The basic function here is like (rand() % range)+ Lower_bound

我试图生成随机字符串,每个字符的出现次数是固定的。例如-G(字符串中的一个字符),不能出现超过4次,S,不超过2次,依此类推。我的代码能够生成字符串,但不能解决字符频率的问题

有什么办法可以解决这个问题吗?任何帮助都将不胜感激

我目前的代码如下:

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

    //The basic function here is like (rand() % range)+ Lower_bound
    int rand_int(int a,int b)
    {    
    if (a > b)  

        return((rand() % (a-b+1)) + b);    
    else if (b > a)        
        return((rand() % (b-a+1)) + a);    
    else        
       return a;
   } 
     int main()
 { 

   FILE *fptr;
   fptr=fopen("C:\\Users\\Desktop\\dataset.txt","w");    
   int a,b,r,i,j,k;    
   char res;    
    a = 65;    
    b = 90;    
    k = 0;    
    char str[] =     "ITLDGGCSSHLPLRCSVDSGCPGLRAGSVSCLPHGSIREGMECSRRHGVGIMGDRRDGSRDS";  //working string     
   char str_all[] = "ITLDGGCSSHLPLRCSVDSGCPGLRAGSVSCLPHGSIREGMECSRRHGVGIMGDRRDGSRDS";    
   char subs[] = "ACDEGHILMPRSTV";    //
   fprintf(fptr,"%s",str);
   fprintf(fptr,"%s","\n");

// value of j represents the number of strings to be displayed    
for(j=0 ; j<10000 ; j++)    
{      
     // getting all the sequence strings      
     // for changing the string at all positions      
      for(i=0 ; i<62 ; i++)      
      {            
         r = rand_int(a,b);        
         res = (char)r;        
         str_all[i] = res;      
      }

   // substituting all the not required characters with required ones      
      for(i=0 ; i<62 ; i++)      
      {      
         if(str_all[i] == 'B' || str_all[i] == 'F' || str_all[i] == 'J' || str_all[i] == 'K' || str_all[i] == 'N' || str_all[i] == 'O' || str_all[i] == 'Q' || str_all[i] == 'U' || str_all[i] == 'W' || str_all[i] == 'X' || str_all[i] == 'Y' || str_all[i] == 'Z')
         {      
           str_all[i] = subs[k++];      
         }      
         if(k>13)        
            k=0;   
      } 
      //printf("\nModified String for all string positions \n%s",str_all);  
        fprintf(fptr,"%s",str_all);
         fprintf(fptr,"%s","\n");
   }  
fclose(fptr);  
return 0;
}
#包括
#包括
//这里的基本函数类似于(rand()%range)+下限
整数和整数(整数a,整数b)
{    
如果(a>b)
返回((rand()%(a-b+1))+b);
否则,如果(b>a)
返回((rand()%(b-a+1))+a);
其他的
返回a;
} 
int main()
{ 
文件*fptr;
fptr=fopen(“C:\\Users\\Desktop\\dataset.txt”、“w”);
int a,b,r,i,j,k;
char res;
a=65;
b=90;
k=0;
char str[]=“ITLDGGSSHLPLRCSVDSGCPGLRAGSVSCLPHGSIREGMECSRRHGVGGIMGDRDGSRDS”;//工作字符串
char str_all[]=“ITLDGGSSHLPLRCSVDSGCPGLRAGSVSCLPHGSIREGMECSRRHGGIMGDRDGSRDS”;
char subs[]=“acdeghillmprstv”//
fprintf(fptr,“%s”,str);
fprintf(fptr,“%s”,“\n”);
//j的值表示要显示的字符串数

对于(j=0;j您只需使用可用字符创建一个固定(常量)字符串,然后在每次需要随机字符串时洗牌一个副本。有关如何在C中洗牌数组,请参见此处:

您只需创建一个固定(常量)使用可用字符串,然后在每次需要随机字符串时洗牌一个副本。有关如何在C中洗牌数组,请参见此处:

您只需创建一个固定的(常量)使用可用字符串,然后在每次需要随机字符串时洗牌一个副本。有关如何在C中洗牌数组,请参见此处:

您只需创建一个固定的(常量)使用可用的字符字符串,然后每次需要随机字符串时都将其副本洗牌。有关如何在C中洗牌数组,请参见此处:

您可以使用。将所有允许的字符放入一个数组中。假设您只允许4个G和2个s,其他什么都不允许。您的数组将如下开始:

char array[] = { 'G', 'G', 'G', 'G', 'S', 'S' };
for (int i = 0 ; i < N_ELEMENTS - 1 ; i++)
{
    int ceiling = N_ELEMENTS - i;
    int choice = arc4random_uniform(ceiling);
    char tmp = array[ceiling - 1];
    array[ceiling - 1] = array[choice];
    array[choice] = tmp;
}
然后应用Fisher-Yates洗牌。Fisher-Yates洗牌从数组中选择一个随机元素并与最后一个元素交换。然后,它从除最后一个元素之外的所有元素中选择一个随机元素,并与除最后一个元素外的最后一个元素交换。然后,它从除最后两个元素之外的所有元素中选择一个随机元素,并与除最后两个之外的最后一个元素交换元素等,直到您仅从第一个元素中选择“随机”元素

大概是这样的:

char array[] = { 'G', 'G', 'G', 'G', 'S', 'S' };
for (int i = 0 ; i < N_ELEMENTS - 1 ; i++)
{
    int ceiling = N_ELEMENTS - i;
    int choice = arc4random_uniform(ceiling);
    char tmp = array[ceiling - 1];
    array[ceiling - 1] = array[choice];
    array[choice] = tmp;
}
for(int i=0;i
使用上述内容的风险由您自己承担,因为它没有经过任何测试甚至编译

我使用
arc4random\u uniform
是因为简单地取一个随机数的模来得到一个较小范围内的随机数会扭曲结果。
arc4random\u uniform
没有这个问题。

你可以使用。将所有允许的字符放入一个数组中。假设你只允许4个G和2个s,而不允许任何字符否则。您的阵列将以如下方式开始:

char array[] = { 'G', 'G', 'G', 'G', 'S', 'S' };
for (int i = 0 ; i < N_ELEMENTS - 1 ; i++)
{
    int ceiling = N_ELEMENTS - i;
    int choice = arc4random_uniform(ceiling);
    char tmp = array[ceiling - 1];
    array[ceiling - 1] = array[choice];
    array[choice] = tmp;
}
然后应用Fisher-Yates洗牌。Fisher-Yates洗牌从数组中选择一个随机元素并与最后一个元素交换。然后,它从除最后一个元素之外的所有元素中选择一个随机元素,并与除最后一个元素外的最后一个元素交换。然后,它从除最后两个元素之外的所有元素中选择一个随机元素,并与除最后两个之外的最后一个元素交换元素等,直到您仅从第一个元素中选择“随机”元素

大概是这样的:

char array[] = { 'G', 'G', 'G', 'G', 'S', 'S' };
for (int i = 0 ; i < N_ELEMENTS - 1 ; i++)
{
    int ceiling = N_ELEMENTS - i;
    int choice = arc4random_uniform(ceiling);
    char tmp = array[ceiling - 1];
    array[ceiling - 1] = array[choice];
    array[choice] = tmp;
}
for(int i=0;i
使用上述内容的风险由您自己承担,因为它没有经过任何测试甚至编译

我使用
arc4random\u uniform
是因为简单地取一个随机数的模来得到一个较小范围内的随机数会扭曲结果。
arc4random\u uniform
没有这个问题。

你可以使用。将所有允许的字符放入一个数组中。假设你只允许4个G和2个s,而不允许任何字符否则。您的阵列将以如下方式开始:

char array[] = { 'G', 'G', 'G', 'G', 'S', 'S' };
for (int i = 0 ; i < N_ELEMENTS - 1 ; i++)
{
    int ceiling = N_ELEMENTS - i;
    int choice = arc4random_uniform(ceiling);
    char tmp = array[ceiling - 1];
    array[ceiling - 1] = array[choice];
    array[choice] = tmp;
}
然后应用Fisher-Yates洗牌。Fisher-Yates洗牌从数组中选择一个随机元素并与最后一个元素交换。然后,它从除最后一个元素之外的所有元素中选择一个随机元素,并与除最后一个元素外的最后一个元素交换。然后,它从除最后两个元素之外的所有元素中选择一个随机元素,并与除最后两个之外的最后一个元素交换元素等,直到您仅从第一个元素中选择“随机”元素

大概是这样的:

char array[] = { 'G', 'G', 'G', 'G', 'S', 'S' };
for (int i = 0 ; i < N_ELEMENTS - 1 ; i++)
{
    int ceiling = N_ELEMENTS - i;
    int choice = arc4random_uniform(ceiling);
    char tmp = array[ceiling - 1];
    array[ceiling - 1] = array[choice];
    array[choice] = tmp;
}
for(int i=0;i
使用上述内容的风险由您自己承担,因为它没有经过任何测试甚至编译

我使用
arc4random\u uniform
是因为简单地取一个随机数的模来得到一个较小范围内的随机数会扭曲结果。
arc4random\u uniform
没有这个问题。

你可以使用。将所有允许的字符放入一个数组中。假设你只允许4个G和2个s,而不允许任何字符否则。您的阵列将以如下方式开始:

char array[] = { 'G', 'G', 'G', 'G', 'S', 'S' };
for (int i = 0 ; i < N_ELEMENTS - 1 ; i++)
{
    int ceiling = N_ELEMENTS - i;
    int choice = arc4random_uniform(ceiling);
    char tmp = array[ceiling - 1];
    array[ceiling - 1] = array[choice];
    array[choice] = tmp;
}
然后你用费舍尔·耶茨洗牌