﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Brandon-随笔分类-脚本语言</title><link>http://www.cppblog.com/maosher/category/10327.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 15 May 2009 20:27:55 GMT</lastBuildDate><pubDate>Fri, 15 May 2009 20:27:55 GMT</pubDate><ttl>60</ttl><item><title>lua的随机数问题</title><link>http://www.cppblog.com/maosher/archive/2009/05/13/82772.html</link><dc:creator>Brandon</dc:creator><author>Brandon</author><pubDate>Wed, 13 May 2009 02:58:00 GMT</pubDate><guid>http://www.cppblog.com/maosher/archive/2009/05/13/82772.html</guid><wfw:comment>http://www.cppblog.com/maosher/comments/82772.html</wfw:comment><comments>http://www.cppblog.com/maosher/archive/2009/05/13/82772.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/maosher/comments/commentRss/82772.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/maosher/services/trackbacks/82772.html</trackback:ping><description><![CDATA[<span  style="color: rgb(102, 102, 102); font-family: verdana; font-size: 12px; line-height: 18px; "><p style="padding-top: 0px; padding-right: 8px; padding-bottom: 12px; padding-left: 8px; color: rgb(0, 0, 0); line-height: 20px; "><span class="Apple-tab-span" style="white-space:pre">	</span><span  style="color: rgb(102, 102, 102); line-height: 18px; "><a href="http://dev.csdn.net/author/yanjun_1982/b682d53ae78846a19eb0b7751a250750.html">http://dev.csdn.net/author/yanjun_1982/b682d53ae78846a19eb0b7751a250750.html</a><span  style="color: rgb(0, 0, 0); line-height: 20px; ">&#160;&#160; &#160;&#160;</span></span></p><p style="padding-top: 0px; padding-right: 8px; padding-bottom: 12px; padding-left: 8px; color: rgb(0, 0, 0); line-height: 20px; ">&#160; &#160;也许很多人会奇怪为什么使用LUA的时候，第一个随机数总是固定，而且常常是最小的那个值，下面我就简要的说明一下吧，说得不好，还请谅解。我现在使用的4.0版本的LUA，看的代码是5.0的，呵呵</p><p style="padding-top: 0px; padding-right: 8px; padding-bottom: 12px; padding-left: 8px; color: rgb(0, 0, 0); line-height: 20px; ">&#160;&#160;&#160;&#160;&#160;&#160;&#160; LUA4.0版本中的自带函数库中有两个关于随机数的函数，一个是random，一个是randomseed。random有两个参数，用来设置随机数的范围，比如random(1,100)设置随机数的范围为1至100之间。由于C中所产生的随机序列是固定的，并且第一个随机数比较小，只有41。LUA重新设计了random函数，使得它可以产生范围固定的随机数，但由于LUA的random只是封装了C的rand函数，使得random函数也有一定的缺陷，那就是如果random的两个输入参数的值相差很小的时候，那么随机序列的第一个随机数就会和第一个输入参数很接近，比如第一次调用random(1,100)的时候，返回值肯定是1，只有相差大于799时，如random(1,800)第一次调用才会返回2，也是很接近1。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 由于这个原因，为了实现真正的随机，那么第一次就不能让玩家调用random函数，不然玩家就可以获得一些低概率的东西了。比如if random(1,100) == 1 then ...... do，看起来是1％的的概率，但是第一次执行的时候是100％成立的，存在一定的隐患。解决这个问题的方法有两个，一就是第一次random函数不能让玩家执行，二就是使用randomseed先设一个随机种子。对于第一种方法，可能还是有一定的风险，毕竟随机序列还是固定的，玩家第一次调用random的时候还是得到有规律的返回值。第二种方法比较安全，在服务器启动的时候设置一个随机种子，让系统产生的随机序列不相同，但使用randomseed的时候也还要注意一个问题，那就是做种子的数要足够的大，大于10000就行了。不然randomseed所产生的随机序列的第一个值还是很小。原因是randomseed是直接封装了C的srand，如果种子的值太小，那么srand所产生的序列和默认序列（srand(1)所产生的序列）是相差不大的，序列的第一个值还是很小。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 因此，只要在服务器启动的时候调用一下randomseed(GetTime())就可以解决这个问题了。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 还要补充一下，LUA中产生随机数的算法还是有一些问题，比如执行random(1,3276700)，它返回的值最后两位必为0。这是由LUA本身的随机函数算法决定的。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 还是简要介绍一下LUA中random函数的实现方法吧，主要由源码中的下面两行实现：<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; lua_Number r = (lua_Number)(rand()%RAND_MAX) / (lua_Number)RAND_MAX;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; lua_pushnumber(L, (int)floor(r*(u-m+1))+m);<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 其中m为random函数的第一个参数，u为第二个参数。由上面的代码可以看出，如果u-l太小，那么当r也很小的时候，r*(u-m+1)就会很小（小于1），那么再经过floor运算，最经结果就是m。这就可以解释为什么random产生的第一个随机数常常会很接近m。再来看看当m为0，u为327670的时候会怎样。在上面的代码里，RAND_MAX是一个宏，它的值是32767,也就是C语言中rand函数可以返回的最大值（不同的操作系统可能会有不一样的最大值）。当m为0，u为327670的时候，那么返回值就是floor(r*(327671)+0)，我们再假设LUA与平台无关并且rand不会返回32767（上面用％避免了这个问题），那么r就可以简化为rand()/RAND_MAX，代入上式为floor(rand()*327671/32767)+0，就算rand()的返回值是32766,最终的结果也只有327660.99996......，经过floor运算后，最后那位数必为0。呵呵，我叫这样的随机数就伪随机数中的伪随机数。实际上面的公式是不允许化简的，即不能简单地把r代入r*(u-m+1)，至于为什么，呵呵，因为r的值并不是rand()/RAND_MAX的值，r是double类型的，所以它只是一个和rand()/RAND_MAX很接近的数。&#160;</p><p style="padding-top: 0px; padding-right: 8px; padding-bottom: 12px; padding-left: 8px; color: rgb(0, 0, 0); line-height: 20px; ">&#160;&#160;&#160;&#160;&#160;&#160;&#160; 引用请注明出处。作者：yanjun_1982&#160;&#160; 日期：2006年10月11日</p></span>
<img src ="http://www.cppblog.com/maosher/aggbug/82772.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/maosher/" target="_blank">Brandon</a> 2009-05-13 10:58 <a href="http://www.cppblog.com/maosher/archive/2009/05/13/82772.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lua  string一些东西</title><link>http://www.cppblog.com/maosher/archive/2009/04/29/81448.html</link><dc:creator>Brandon</dc:creator><author>Brandon</author><pubDate>Wed, 29 Apr 2009 07:51:00 GMT</pubDate><guid>http://www.cppblog.com/maosher/archive/2009/04/29/81448.html</guid><wfw:comment>http://www.cppblog.com/maosher/comments/81448.html</wfw:comment><comments>http://www.cppblog.com/maosher/archive/2009/04/29/81448.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/maosher/comments/commentRss/81448.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/maosher/services/trackbacks/81448.html</trackback:ping><description><![CDATA[
<div>一,函数<span class="Apple-tab-span" style="white-space:pre"></span></div><div><span class="Apple-tab-span" style="white-space:pre">	</span>string.len(s)</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>string.find(s, sd, [index]) 返回i, j 表示 起始，终了位置索引。</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>string.sub</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>string.gsub</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>string.gfind</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>string.char</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>string.byte</div><div><span class="Apple-tab-span" style="white-space:pre">	</span></div><div><span class="Apple-tab-span" style="white-space:pre">	</span>string.format</div><div><br></div><div>二,字符类和模式修饰符</div><div>. &#160; &#160; &#160;任意字符</div><div>%a &#160; &#160; 字母</div><div>%c &#160; &#160; 控制字符</div><div>%d &#160; &#160; 数字</div><div>%l &#160; &#160; 小写字母</div><div>%p &#160; &#160; 标点字符</div><div>%s &#160; &#160; 空白符</div><div>%u &#160; &#160; 大写字母</div><div>%w &#160; &#160; 字母和数字</div><div>%x &#160; &#160; 十六进制数字</div><div>%z &#160; &#160; 代表0的字符<span class="Apple-tab-span" style="white-space:pre">	</span></div><div><br></div><div>模式修饰符有四个：</div><div>+ &#160; &#160; &#160;匹配前一字符1次或多次</div><div>* &#160; &#160; &#160;匹配前一字符0次或多次</div><div>- &#160; &#160; &#160;匹配前一字符0次或多次</div><div>? &#160; &#160; &#160;匹配前一字符0次或1次</div><img src ="http://www.cppblog.com/maosher/aggbug/81448.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/maosher/" target="_blank">Brandon</a> 2009-04-29 15:51 <a href="http://www.cppblog.com/maosher/archive/2009/04/29/81448.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>郁闷的一个问题</title><link>http://www.cppblog.com/maosher/archive/2009/04/28/81338.html</link><dc:creator>Brandon</dc:creator><author>Brandon</author><pubDate>Tue, 28 Apr 2009 10:14:00 GMT</pubDate><guid>http://www.cppblog.com/maosher/archive/2009/04/28/81338.html</guid><wfw:comment>http://www.cppblog.com/maosher/comments/81338.html</wfw:comment><comments>http://www.cppblog.com/maosher/archive/2009/04/28/81338.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/maosher/comments/commentRss/81338.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/maosher/services/trackbacks/81338.html</trackback:ping><description><![CDATA[<span  style="font-family: Verdana; font-size: 13px; line-height: 19px; "><div>今天碰到个问题：</div><div>lua里在一个串里查找&#8220;（&#8221;怎么写，查找一个&#8220;）&#8221;可以写作i,j = string.find(s, ")")；</div><div>而碰到&#8220;（&#8221;时是会出错的，怀疑一词法分析的时候一碰到&#8220;（&#8221;就压进栈了，然后因为括号不匹配报错？&#160;</div><div>也不能对&#8220;(&#8221;提供转义</div></span>
<img src ="http://www.cppblog.com/maosher/aggbug/81338.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/maosher/" target="_blank">Brandon</a> 2009-04-28 18:14 <a href="http://www.cppblog.com/maosher/archive/2009/04/28/81338.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>