case 18: ch='r';
break ;
case 19: ch='s';
break ;
case 20: ch='t';
break ;
case 21: ch='u';
break ;
case 22: ch='v';
break ;
case 23: ch='w';
break ;
case 24: ch='x';
break ;
case 25: ch='y';
break ;
case 26: ch='z';
break ;
case 27:ch='0';
break;
case 28:ch='1';
break;
case 29:ch='2';
break;
case 30:ch='3';
break;
case 31:ch='4';
break;
case 32:ch='5';
break;
case 33:ch='6';
break;
case 34:ch='7';
break;
case 35:ch='8';
break;
case 36:ch='9';
break;
}//end of switch
cout< }//end of for loop
cout< return 0;
}
而运行结果显示的随机字符串的每一个字符都是一样的,也就是说生成的字符序列不随机,所以我们需要把 srand((unsigned)time(NULL)); 从for循环中移出放在for语句前面,这样可以生成随机的字符序列,而且每次运行生成的字符序列会不同(呵呵,也有可能相同,不过出现这种情况的几率太小了)。
如果你把srand((unsigned)time(NULL));改成srand(2);这样虽然在一次运行中产生的字符序列是随机的,但是每次运行时产生的随机字符序列串是相同的。把srand这一句从程序中去掉也是这样。
此外,你可能会遇到这种情况,在使用timer控件编制程序的时候会发现用相同的时间间隔生成的一组随机数会显得有规律,而由用户按键 command事件产生的一组随机数却显得比较随机,为什么?根据我们上面的分析,你可以很快想出答案。这是因为timer是由计算机时钟记数器精确控制时间间隔的控件,时间间隔相同,记数器前后的值之差相同,这样时钟取值就是呈线性规律的,所以随机种子是呈线性规律的,生成的随机数也是有规律的。而用户按键事件产生随机数确实更呈现随机性,因为事件是由人按键引起的,而人不能保证严格的按键时间间隔,即使严格地去做,也不可能完全精确做到,只要时间间隔相差一微秒,记数器前后的值之差就不相同了,随机种子的变化就失去了线性规律,那么生成的随机数就更没有规律了,所以这样生成的一组随机数更随机。这让我想到了各种晚会的抽奖程序,如果用人来按键产生幸运观众的话,那就会很好的实现随机性原则,结果就会更公正。
最后,我总结两个要点:
1.计算机的伪随机数是由随机种子根据一定的计算方法计算出来的数值。所以,只要计算方法一定,随机种子一定,那么产生的随机数就是固定的。
2.只要用户或第三方不设置随机种子,那么在默认情况下随机种子来自系统时钟。