⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 randomname.c,v

📁 Markov 过程
💻 C,V
字号:
head	1.1;access;symbols;locks	olethros:1.1; strict;comment	@ * @;1.1date	2003.02.09.18.37.34;	author olethros;	state Exp;branches;next	;desc@An example of using the markov chain.@1.1log@Initial revision@text@#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include "debug.h"#include "MarkovChain.h"typedef struct State_ {  char c;} State;#define N_STATES 27int main (int argc, char** argv) {  State* state;  char* fname;  FILE* fstream;  int n_states = N_STATES;  MarkovChain* chain = NULL;  int mem_size = 1;  int i;  printf ("\n\Random Name Generator: Using Markov Chains to create random names from examples\n\n2003, Christos Dimitrakakis\n\n");  srand48(time(NULL));  if (argc!=3) {    fprintf (stderr, "Usage : randomname memsize namelist\n\n\Where memsize is a positive integer and namelist is the file that\n\should be used for taking examples from.\n\n");    return -1;  }  mem_size = atoi (argv[1]);  printf ("Using a memory size of %d\n", mem_size);  fname = argv[2];  if (!fname) {    fprintf (stderr, "You must supply a filename\n");  }  printf ("Creating Markov Chain\n");  if ((chain = NewMarkovChain (n_states, mem_size))==NULL) {    fprintf (stderr, "Failed to create chain - try a smaller memory size!\n");    return -1;  }    state = (State*) malloc (n_states * sizeof(State));  if (state==NULL) {    DeleteMarkovChain (chain);    Serror ("malloc failed");    return -1;  }    for (i=1; i<n_states; i++) {    state[i].c = i-1+'a';  }  state[0].c = ' ';  // clear state transition tables.  printf ("Clearing state transitions\n");  printf ("Opening file\n");  fstream = fopen (fname, "r");  if (fstream) {    int prev = 0;    int curr = 0;    int ret = 0;    int cnt = 0;    printf ("Processing input file...\n");    do {      ret = fgetc(fstream);      cnt++;      if (ret!=EOF) {	prev = curr;	if ((ret>='A')&&(ret<='Z')) {	  ret = ret - 'A' + 'a';	}	if ((ret<'a')||(ret>'z')) {	  curr = 0;	} else {	  curr = 1+ret-'a';	}	MarkovChainTrain (chain, curr);	if (curr==0) {	  MarkovChainReset (chain);	}      }    } while (ret!=EOF);    printf ("Closing file after reading %d characters\n",cnt);    fclose (fstream);  } else {    fprintf (stderr, "Error, could not open file\n");  }  printf ("Normalizing state transitions\n");  printf ("(Observed transitions: %d)\n", MarkovChainNormalize (chain));  #ifdef DISPLAY_TRANSITION_TABLES  for (i=0; i<n_states; i++) {    int j;    for (j=0; j<n_states; j++) {      printf ("%c->%c=%f\n",state[i].c,state[j].c,trans[i+j*n_states]);    }  }#endif  printf ("Generating names from the chain\n");  printf ("\n-----------------------------\n");  {    int next = n_states-1;    int curr = n_states-1;    int cnt=1000;    /* MarkovChainReset() is called at the beginning of the generation    and also at points where a whitespace is generated. It is also    called when nothing is generated (although this should never    happen, as transition tables exist for even non-encountered    states). MarkovChainReset() ensures that we only take into account    letter order when generating words. Thus, after whitespace or end    of generation a new word is created from scratch. */    MarkovChainReset (chain);    for (i=0; i<50;) {      next = MarkovChainGenerate (chain);      MarkovChainPushState (chain, next);      if (next<=0) {	MarkovChainReset (chain);      }      if (next<0) {	next = 0;      }      if ((curr!=next)||(next)) {	printf ("%c",state[next].c);	i++;	cnt=1000;      }      cnt--;      curr = next;      if (!cnt) {	fprintf (stderr, "Waiting too long for something to be generated. Aborting\n");	MarkovChainShowTransitions (chain);	break;      }    }  }  printf ("\n-----------------------------\n");  printf ("Freeing memory\n");  free (state);  DeleteMarkovChain (chain);  printf("Exiting\n");  return 0;  }@

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -