【问题标题】:Can a random string be generated with the frequency of characters in it, fixed?可以生成一个随机字符串,其中的字符频率是固定的吗?
【发布时间】:2015-09-14 12:20:14
【问题描述】:

我正在尝试生成随机字符串,每个字符的出现次数是固定的。例如-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;
}

【问题讨论】:

  • 您可以计算 char 生成的次数,并在超出限制时进行限制。
  • 关于您的代码的一些不相关的注释:intchar 类型大部分是可互换的,因此您可以这样做,例如str_all[i] = rand_int(a, b);对于ab,不要使用“幻数”,而是使用实际字符文字'A''Z';您只在一个地方使用 ab ,而是在那里使用字符文字;无需调用fprintf 两次来打印一行,例如fprintf(fptr, "%s\n", str_all);
  • 这里是完整代码,复制粘贴...stackoverflow.com/a/33991225/294884

标签: c random


【解决方案1】:

您可以简单地使用可用字符创建一个固定(恒定)字符串,然后在每次需要随机字符串时随机播放它的副本。有关如何在 C 中打乱数组,请参见此处:Shuffle array in C

【讨论】:

    【解决方案2】:

    您可以使用Fisher Yates shuffle。将所有允许的字符放入一个数组中。假设您只允许使用 4 个 G 和 2 个 S,没有别的。你的数组会像这样开始:

    char array[] = { 'G', 'G', 'G', 'G', 'S', 'S' };
    

    然后您应用 Fisher Yates 洗牌。 Fisher Yates shuffle 从数组中选择一个随机元素并将其与最后一个元素交换。然后它从除了最后一个元素之外的所有元素中选择一个随机元素,并将它与最后一个元素交换。然后它从除了最后两个元素之外的所有元素中选择一个随机元素,并将它与最后两个元素交换,依此类推,直到您仅从第一个元素中选择一个“随机”元素。

    类似这样的:

    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;
    }
    

    使用上述内容需要您自担风险,因为它没有经过测试甚至编译。

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

    【讨论】:

    • 但这仅适用于特定情况。他说等等,在这种方法中,如果需要,他将不得不为n字符创建该数组是n 个字符。
    • @ameyCU 你可以动态填充初始数组。
    猜你喜欢
    • 2015-02-05
    • 2011-09-26
    • 2015-09-13
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多