Difference between revisions of "Source:NetHack 3.6.0/src/rnd.c"

From NetHackWiki
Jump to navigation Jump to search
(Created page with "__MIXEDSYNTAXHIGHLIGHT__ Below is the full text to '''rnd.c''' from the source code of NetHack 3.6.0. To link to a particular line, write S...")
 
m (headerz)
 
(One intermediate revision by the same user not shown)
Line 3: Line 3:
  
 
{{NGPL}}
 
{{NGPL}}
  <span id="line1">1.   /* NetHack 3.6 rnd.c $NHDT-Date: 1446883921 2015/11/07 08:12:01 $  $NHDT-Branch: master $:$NHDT-Revision: 1.16 $ */</span>
+
 
  <span id="line2">2.   /* NetHack may be freely redistributed.  See license for details. */</span>
+
== Top of file ==
  <span id="line3">3.   </span>
+
 
  <span id="line4">4.   #include "hack.h"</span>
+
  <span id="line1">1. /* NetHack 3.6 rnd.c $NHDT-Date: 1446883921 2015/11/07 08:12:01 $  $NHDT-Branch: master $:$NHDT-Revision: 1.16 $ */</span>
  <span id="line5">5.   </span>
+
  <span id="line2">2. /* NetHack may be freely redistributed.  See license for details. */</span>
  <span id="line6">6.   /* "Rand()"s definition is determined by [OS]conf.h */</span>
+
  <span id="line3">3. </span>
  <span id="line7">7.   #if defined(LINT) && defined(UNIX) /* rand() is long... */</span>
+
  <span id="line4">4. #include "hack.h"</span>
  <span id="line8">8.   extern int NDECL(rand);</span>
+
  <span id="line5">5. </span>
  <span id="line9">9.   #define RND(x) (rand() % x)</span>
+
  <span id="line6">6. /* "Rand()"s definition is determined by [OS]conf.h */</span>
  <span id="line10">10.   #else /* LINT */</span>
+
  <span id="line7">7. #if defined(LINT) && defined(UNIX) /* rand() is long... */</span>
  <span id="line11">11.   #if defined(UNIX) || defined(RANDOM)</span>
+
  <span id="line8">8. extern int NDECL(rand);</span>
  <span id="line12">12.   #define RND(x) ((int) (Rand() % (long) (x)))</span>
+
  <span id="line9">9. #define RND(x) (rand() % x)</span>
  <span id="line13">13.   #else</span>
+
  <span id="line10">10. #else /* LINT */</span>
  <span id="line14">14.   /* Good luck: the bottom order bits are cyclic. */</span>
+
  <span id="line11">11. #if defined(UNIX) || defined(RANDOM)</span>
  <span id="line15">15.   #define RND(x) ((int) ((Rand() >> 3) % (x)))</span>
+
  <span id="line12">12. #define RND(x) ((int) (Rand() % (long) (x)))</span>
  <span id="line16">16.   #endif</span>
+
  <span id="line13">13. #else</span>
  <span id="line17">17.   #endif /* LINT */</span>
+
  <span id="line14">14. /* Good luck: the bottom order bits are cyclic. */</span>
  <span id="line18">18.   </span>
+
  <span id="line15">15. #define RND(x) ((int) ((Rand() >> 3) % (x)))</span>
  <span id="line19">19.   /* 0 <= rn2(x) < x */</span>
+
  <span id="line16">16. #endif</span>
  <span id="line20">20.   int</span>
+
  <span id="line17">17. #endif /* LINT */</span>
  <span id="line21">21.   rn2(x)</span>
+
  <span id="line18">18. </span>
  <span id="line22">22.   register int x;</span>
+
 
  <span id="line23">23.   {</span>
+
== rn2 ==
  <span id="line24">24.   #ifdef BETA</span>
+
   
  <span id="line25">25.       if (x <= 0) {</span>
+
  <span id="line19">19. /* 0 <= rn2(x) < x */</span>
  <span id="line26">26.           impossible("rn2(%d) attempted", x);</span>
+
  <span id="line20">20. int</span>
  <span id="line27">27.           return 0;</span>
+
  <span id="line21">21. rn2(x)</span>
  <span id="line28">28.       }</span>
+
  <span id="line22">22. register int x;</span>
  <span id="line29">29.       x = RND(x);</span>
+
  <span id="line23">23. {</span>
  <span id="line30">30.       return x;</span>
+
  <span id="line24">24. #ifdef BETA</span>
  <span id="line31">31.   #else</span>
+
  <span id="line25">25.     if (x <= 0) {</span>
  <span id="line32">32.       return RND(x);</span>
+
  <span id="line26">26.         impossible("rn2(%d) attempted", x);</span>
  <span id="line33">33.   #endif</span>
+
  <span id="line27">27.         return 0;</span>
  <span id="line34">34.   }</span>
+
  <span id="line28">28.     }</span>
  <span id="line35">35.   </span>
+
  <span id="line29">29.     x = RND(x);</span>
  <span id="line36">36.   /* 0 <= rnl(x) < x; sometimes subtracting Luck;</span>
+
  <span id="line30">30.     return x;</span>
  <span id="line37">37.     good luck approaches 0, bad luck approaches (x-1) */</span>
+
  <span id="line31">31. #else</span>
  <span id="line38">38.   int</span>
+
  <span id="line32">32.     return RND(x);</span>
  <span id="line39">39.   rnl(x)</span>
+
  <span id="line33">33. #endif</span>
  <span id="line40">40.   register int x;</span>
+
  <span id="line34">34. }</span>
  <span id="line41">41.   {</span>
+
  <span id="line35">35. </span>
  <span id="line42">42.       register int i, adjustment;</span>
+
 
  <span id="line43">43.   </span>
+
== rnl ==
  <span id="line44">44.   #ifdef BETA</span>
+
   
  <span id="line45">45.       if (x <= 0) {</span>
+
  <span id="line36">36. /* 0 <= rnl(x) < x; sometimes subtracting Luck;</span>
  <span id="line46">46.           impossible("rnl(%d) attempted", x);</span>
+
  <span id="line37">37.   good luck approaches 0, bad luck approaches (x-1) */</span>
  <span id="line47">47.           return 0;</span>
+
  <span id="line38">38. int</span>
  <span id="line48">48.       }</span>
+
  <span id="line39">39. rnl(x)</span>
  <span id="line49">49.   #endif</span>
+
  <span id="line40">40. register int x;</span>
  <span id="line50">50.   </span>
+
  <span id="line41">41. {</span>
  <span id="line51">51.       adjustment = Luck;</span>
+
  <span id="line42">42.     register int i, adjustment;</span>
  <span id="line52">52.       if (x <= 15) {</span>
+
  <span id="line43">43. </span>
  <span id="line53">53.           /* for small ranges, use Luck/3 (rounded away from 0);</span>
+
  <span id="line44">44. #ifdef BETA</span>
  <span id="line54">54.             also guard against architecture-specific differences</span>
+
  <span id="line45">45.     if (x <= 0) {</span>
  <span id="line55">55.             of integer division involving negative values */</span>
+
  <span id="line46">46.         impossible("rnl(%d) attempted", x);</span>
  <span id="line56">56.           adjustment = (abs(adjustment) + 1) / 3 * sgn(adjustment);</span>
+
  <span id="line47">47.         return 0;</span>
  <span id="line57">57.           /*</span>
+
  <span id="line48">48.     }</span>
  <span id="line58">58.           *      11..13 ->  4</span>
+
  <span id="line49">49. #endif</span>
  <span id="line59">59.           *        8..10 ->  3</span>
+
  <span id="line50">50. </span>
  <span id="line60">60.           *        5.. 7 ->  2</span>
+
  <span id="line51">51.     adjustment = Luck;</span>
  <span id="line61">61.           *        2.. 4 ->  1</span>
+
  <span id="line52">52.     if (x <= 15) {</span>
  <span id="line62">62.           *      -1,0,1 ->  0 (no adjustment)</span>
+
  <span id="line53">53.         /* for small ranges, use Luck/3 (rounded away from 0);</span>
  <span id="line63">63.           *      -4..-2 -> -1</span>
+
  <span id="line54">54.           also guard against architecture-specific differences</span>
  <span id="line64">64.           *      -7..-5 -> -2</span>
+
  <span id="line55">55.           of integer division involving negative values */</span>
  <span id="line65">65.           *      -10..-8 -> -3</span>
+
  <span id="line56">56.         adjustment = (abs(adjustment) + 1) / 3 * sgn(adjustment);</span>
  <span id="line66">66.           *      -13..-11-> -4</span>
+
  <span id="line57">57.         /*</span>
  <span id="line67">67.           */</span>
+
  <span id="line58">58.         *      11..13 ->  4</span>
  <span id="line68">68.       }</span>
+
  <span id="line59">59.         *        8..10 ->  3</span>
  <span id="line69">69.   </span>
+
  <span id="line60">60.         *        5.. 7 ->  2</span>
  <span id="line70">70.       i = RND(x);</span>
+
  <span id="line61">61.         *        2.. 4 ->  1</span>
  <span id="line71">71.       if (adjustment && rn2(37 + abs(adjustment))) {</span>
+
  <span id="line62">62.         *      -1,0,1 ->  0 (no adjustment)</span>
  <span id="line72">72.           i -= adjustment;</span>
+
  <span id="line63">63.         *      -4..-2 -> -1</span>
  <span id="line73">73.           if (i < 0)</span>
+
  <span id="line64">64.         *      -7..-5 -> -2</span>
  <span id="line74">74.               i = 0;</span>
+
  <span id="line65">65.         *      -10..-8 -> -3</span>
  <span id="line75">75.           else if (i >= x)</span>
+
  <span id="line66">66.         *      -13..-11-> -4</span>
  <span id="line76">76.               i = x - 1;</span>
+
  <span id="line67">67.         */</span>
  <span id="line77">77.       }</span>
+
  <span id="line68">68.     }</span>
  <span id="line78">78.       return i;</span>
+
  <span id="line69">69. </span>
  <span id="line79">79.   }</span>
+
  <span id="line70">70.     i = RND(x);</span>
  <span id="line80">80.   </span>
+
  <span id="line71">71.     if (adjustment && rn2(37 + abs(adjustment))) {</span>
  <span id="line81">81.   /* 1 <= rnd(x) <= x */</span>
+
  <span id="line72">72.         i -= adjustment;</span>
  <span id="line82">82.   int</span>
+
  <span id="line73">73.         if (i < 0)</span>
  <span id="line83">83.   rnd(x)</span>
+
  <span id="line74">74.             i = 0;</span>
  <span id="line84">84.   register int x;</span>
+
  <span id="line75">75.         else if (i >= x)</span>
  <span id="line85">85.   {</span>
+
  <span id="line76">76.             i = x - 1;</span>
  <span id="line86">86.   #ifdef BETA</span>
+
  <span id="line77">77.     }</span>
  <span id="line87">87.       if (x <= 0) {</span>
+
  <span id="line78">78.     return i;</span>
  <span id="line88">88.           impossible("rnd(%d) attempted", x);</span>
+
  <span id="line79">79. }</span>
  <span id="line89">89.           return 1;</span>
+
  <span id="line80">80. </span>
  <span id="line90">90.       }</span>
+
 
  <span id="line91">91.   #endif</span>
+
== rnd ==
  <span id="line92">92.       x = RND(x) + 1;</span>
+
   
  <span id="line93">93.       return x;</span>
+
  <span id="line81">81. /* 1 <= rnd(x) <= x */</span>
  <span id="line94">94.   }</span>
+
  <span id="line82">82. int</span>
  <span id="line95">95.   </span>
+
  <span id="line83">83. rnd(x)</span>
  <span id="line96">96.   /* d(N,X) == NdX == dX+dX+...+dX N times; n <= d(n,x) <= (n*x) */</span>
+
  <span id="line84">84. register int x;</span>
  <span id="line97">97.   int</span>
+
  <span id="line85">85. {</span>
  <span id="line98">98.   d(n, x)</span>
+
  <span id="line86">86. #ifdef BETA</span>
  <span id="line99">99.   register int n, x;</span>
+
  <span id="line87">87.     if (x <= 0) {</span>
  <span id="line100">100. {</span>
+
  <span id="line88">88.         impossible("rnd(%d) attempted", x);</span>
  <span id="line101">101.     register int tmp = n;</span>
+
  <span id="line89">89.         return 1;</span>
  <span id="line102">102. </span>
+
  <span id="line90">90.     }</span>
  <span id="line103">103. #ifdef BETA</span>
+
  <span id="line91">91. #endif</span>
  <span id="line104">104.     if (x < 0 || n < 0 || (x == 0 && n != 0)) {</span>
+
  <span id="line92">92.     x = RND(x) + 1;</span>
  <span id="line105">105.         impossible("d(%d,%d) attempted", n, x);</span>
+
  <span id="line93">93.     return x;</span>
  <span id="line106">106.         return 1;</span>
+
  <span id="line94">94. }</span>
  <span id="line107">107.     }</span>
+
  <span id="line95">95. </span>
  <span id="line108">108. #endif</span>
+
 
  <span id="line109">109.     while (n--)</span>
+
== d ==
  <span id="line110">110.         tmp += RND(x);</span>
+
   
  <span id="line111">111.     return tmp; /* Alea iacta est. -- J.C. */</span>
+
  <span id="line96">96. /* d(N,X) == NdX == dX+dX+...+dX N times; n <= d(n,x) <= (n*x) */</span>
  <span id="line112">112. }</span>
+
  <span id="line97">97. int</span>
  <span id="line113">113. </span>
+
  <span id="line98">98. d(n, x)</span>
  <span id="line114">114. /* 1 <= rne(x) <= max(u.ulevel/3,5) */</span>
+
  <span id="line99">99. register int n, x;</span>
  <span id="line115">115. int</span>
+
  <span id="line100">100. {</span>
  <span id="line116">116. rne(x)</span>
+
  <span id="line101">101.     register int tmp = n;</span>
  <span id="line117">117. register int x;</span>
+
  <span id="line102">102. </span>
  <span id="line118">118. {</span>
+
  <span id="line103">103. #ifdef BETA</span>
  <span id="line119">119.     register int tmp, utmp;</span>
+
  <span id="line104">104.     if (x < 0 || n < 0 || (x == 0 && n != 0)) {</span>
  <span id="line120">120. </span>
+
  <span id="line105">105.         impossible("d(%d,%d) attempted", n, x);</span>
  <span id="line121">121.     utmp = (u.ulevel < 15) ? 5 : u.ulevel / 3;</span>
+
  <span id="line106">106.         return 1;</span>
  <span id="line122">122.     tmp = 1;</span>
+
  <span id="line107">107.     }</span>
  <span id="line123">123.     while (tmp < utmp && !rn2(x))</span>
+
  <span id="line108">108. #endif</span>
  <span id="line124">124.         tmp++;</span>
+
  <span id="line109">109.     while (n--)</span>
  <span id="line125">125.     return tmp;</span>
+
  <span id="line110">110.         tmp += RND(x);</span>
  <span id="line126">126. </span>
+
  <span id="line111">111.     return tmp; /* Alea iacta est. -- J.C. */</span>
  <span id="line127">127.     /* was:</span>
+
  <span id="line112">112. }</span>
  <span id="line128">128.       *  tmp = 1;</span>
+
  <span id="line113">113. </span>
  <span id="line129">129.       *  while (!rn2(x))</span>
+
 
  <span id="line130">130.       *    tmp++;</span>
+
== rne ==
  <span id="line131">131.       *  return min(tmp, (u.ulevel < 15) ? 5 : u.ulevel / 3);</span>
+
   
  <span id="line132">132.       * which is clearer but less efficient and stands a vanishingly</span>
+
  <span id="line114">114. /* 1 <= rne(x) <= max(u.ulevel/3,5) */</span>
  <span id="line133">133.       * small chance of overflowing tmp</span>
+
  <span id="line115">115. int</span>
  <span id="line134">134.       */</span>
+
  <span id="line116">116. rne(x)</span>
  <span id="line135">135. }</span>
+
  <span id="line117">117. register int x;</span>
  <span id="line136">136. </span>
+
  <span id="line118">118. {</span>
  <span id="line137">137. /* rnz: everyone's favorite! */</span>
+
  <span id="line119">119.     register int tmp, utmp;</span>
  <span id="line138">138. int</span>
+
  <span id="line120">120. </span>
  <span id="line139">139. rnz(i)</span>
+
  <span id="line121">121.     utmp = (u.ulevel < 15) ? 5 : u.ulevel / 3;</span>
  <span id="line140">140. int i;</span>
+
  <span id="line122">122.     tmp = 1;</span>
  <span id="line141">141. {</span>
+
  <span id="line123">123.     while (tmp < utmp && !rn2(x))</span>
  <span id="line142">142. #ifdef LINT</span>
+
  <span id="line124">124.         tmp++;</span>
  <span id="line143">143.     int x = i;</span>
+
  <span id="line125">125.     return tmp;</span>
  <span id="line144">144.     int tmp = 1000;</span>
+
  <span id="line126">126. </span>
  <span id="line145">145. #else</span>
+
  <span id="line127">127.     /* was:</span>
  <span id="line146">146.     register long x = (long) i;</span>
+
  <span id="line128">128.     *  tmp = 1;</span>
  <span id="line147">147.     register long tmp = 1000L;</span>
+
  <span id="line129">129.     *  while (!rn2(x))</span>
  <span id="line148">148. #endif</span>
+
  <span id="line130">130.     *    tmp++;</span>
  <span id="line149">149. </span>
+
  <span id="line131">131.     *  return min(tmp, (u.ulevel < 15) ? 5 : u.ulevel / 3);</span>
  <span id="line150">150.     tmp += rn2(1000);</span>
+
  <span id="line132">132.     * which is clearer but less efficient and stands a vanishingly</span>
  <span id="line151">151.     tmp *= rne(4);</span>
+
  <span id="line133">133.     * small chance of overflowing tmp</span>
  <span id="line152">152.     if (rn2(2)) {</span>
+
  <span id="line134">134.     */</span>
  <span id="line153">153.         x *= tmp;</span>
+
  <span id="line135">135. }</span>
  <span id="line154">154.         x /= 1000;</span>
+
  <span id="line136">136. </span>
  <span id="line155">155.     } else {</span>
+
 
  <span id="line156">156.         x *= 1000;</span>
+
== rnz ==
  <span id="line157">157.         x /= tmp;</span>
+
   
  <span id="line158">158.     }</span>
+
  <span id="line137">137. /* rnz: everyone's favorite! */</span>
  <span id="line159">159.     return (int) x;</span>
+
  <span id="line138">138. int</span>
  <span id="line160">160. }</span>
+
  <span id="line139">139. rnz(i)</span>
  <span id="line161">161. </span>
+
  <span id="line140">140. int i;</span>
  <span id="line162">162. /*rnd.c*/</span>
+
  <span id="line141">141. {</span>
 +
  <span id="line142">142. #ifdef LINT</span>
 +
  <span id="line143">143.     int x = i;</span>
 +
  <span id="line144">144.     int tmp = 1000;</span>
 +
  <span id="line145">145. #else</span>
 +
  <span id="line146">146.     register long x = (long) i;</span>
 +
  <span id="line147">147.     register long tmp = 1000L;</span>
 +
  <span id="line148">148. #endif</span>
 +
  <span id="line149">149. </span>
 +
  <span id="line150">150.     tmp += rn2(1000);</span>
 +
  <span id="line151">151.     tmp *= rne(4);</span>
 +
  <span id="line152">152.     if (rn2(2)) {</span>
 +
  <span id="line153">153.         x *= tmp;</span>
 +
  <span id="line154">154.         x /= 1000;</span>
 +
  <span id="line155">155.     } else {</span>
 +
  <span id="line156">156.         x *= 1000;</span>
 +
  <span id="line157">157.         x /= tmp;</span>
 +
  <span id="line158">158.     }</span>
 +
  <span id="line159">159.     return (int) x;</span>
 +
  <span id="line160">160. }</span>
 +
  <span id="line161">161. </span>
 +
  <span id="line162">162. /*rnd.c*/</span>
 
[[Category:NetHack 3.6.0 source code|src/rnd.c]]
 
[[Category:NetHack 3.6.0 source code|src/rnd.c]]

Latest revision as of 02:48, 21 December 2015

Below is the full text to rnd.c from the source code of NetHack 3.6.0. To link to a particular line, write [[Source:NetHack 3.6.0/src/rnd.c#line123]], for example.

The NetHack General Public License applies to screenshots, source code and other content from NetHack.

This content was modified from the original NetHack source code distribution (by splitting up NetHack content between wiki pages, and possibly further editing). See the page history for a list of who changed it, and on what dates.

Top of file

 /* NetHack 3.6	rnd.c	$NHDT-Date: 1446883921 2015/11/07 08:12:01 $  $NHDT-Branch: master $:$NHDT-Revision: 1.16 $ */
 /* NetHack may be freely redistributed.  See license for details. */
 
 #include "hack.h"
 
 /* "Rand()"s definition is determined by [OS]conf.h */
 #if defined(LINT) && defined(UNIX) /* rand() is long... */
 extern int NDECL(rand);
 #define RND(x) (rand() % x)
 #else /* LINT */
 #if defined(UNIX) || defined(RANDOM)
 #define RND(x) ((int) (Rand() % (long) (x)))
 #else
 /* Good luck: the bottom order bits are cyclic. */
 #define RND(x) ((int) ((Rand() >> 3) % (x)))
 #endif
 #endif /* LINT */
 

rn2

 /* 0 <= rn2(x) < x */
 int
 rn2(x)
 register int x;
 {
 #ifdef BETA
     if (x <= 0) {
         impossible("rn2(%d) attempted", x);
         return 0;
     }
     x = RND(x);
     return x;
 #else
     return RND(x);
 #endif
 }
 

rnl

 /* 0 <= rnl(x) < x; sometimes subtracting Luck;
    good luck approaches 0, bad luck approaches (x-1) */
 int
 rnl(x)
 register int x;
 {
     register int i, adjustment;
 
 #ifdef BETA
     if (x <= 0) {
         impossible("rnl(%d) attempted", x);
         return 0;
     }
 #endif
 
     adjustment = Luck;
     if (x <= 15) {
         /* for small ranges, use Luck/3 (rounded away from 0);
            also guard against architecture-specific differences
            of integer division involving negative values */
         adjustment = (abs(adjustment) + 1) / 3 * sgn(adjustment);
         /*
          *       11..13 ->  4
          *        8..10 ->  3
          *        5.. 7 ->  2
          *        2.. 4 ->  1
          *       -1,0,1 ->  0 (no adjustment)
          *       -4..-2 -> -1
          *       -7..-5 -> -2
          *      -10..-8 -> -3
          *      -13..-11-> -4
          */
     }
 
     i = RND(x);
     if (adjustment && rn2(37 + abs(adjustment))) {
         i -= adjustment;
         if (i < 0)
             i = 0;
         else if (i >= x)
             i = x - 1;
     }
     return i;
 }
 

rnd

 /* 1 <= rnd(x) <= x */
 int
 rnd(x)
 register int x;
 {
 #ifdef BETA
     if (x <= 0) {
         impossible("rnd(%d) attempted", x);
         return 1;
     }
 #endif
     x = RND(x) + 1;
     return x;
 }
 

d

 /* d(N,X) == NdX == dX+dX+...+dX N times; n <= d(n,x) <= (n*x) */
 int
 d(n, x)
 register int n, x;
 {
     register int tmp = n;
 
 #ifdef BETA
     if (x < 0 || n < 0 || (x == 0 && n != 0)) {
         impossible("d(%d,%d) attempted", n, x);
         return 1;
     }
 #endif
     while (n--)
         tmp += RND(x);
     return tmp; /* Alea iacta est. -- J.C. */
 }
 

rne

 /* 1 <= rne(x) <= max(u.ulevel/3,5) */
 int
 rne(x)
 register int x;
 {
     register int tmp, utmp;
 
     utmp = (u.ulevel < 15) ? 5 : u.ulevel / 3;
     tmp = 1;
     while (tmp < utmp && !rn2(x))
         tmp++;
     return tmp;
 
     /* was:
      *  tmp = 1;
      *  while (!rn2(x))
      *    tmp++;
      *  return min(tmp, (u.ulevel < 15) ? 5 : u.ulevel / 3);
      * which is clearer but less efficient and stands a vanishingly
      * small chance of overflowing tmp
      */
 }
 

rnz

 /* rnz: everyone's favorite! */
 int
 rnz(i)
 int i;
 {
 #ifdef LINT
     int x = i;
     int tmp = 1000;
 #else
     register long x = (long) i;
     register long tmp = 1000L;
 #endif
 
     tmp += rn2(1000);
     tmp *= rne(4);
     if (rn2(2)) {
         x *= tmp;
         x /= 1000;
     } else {
         x *= 1000;
         x /= tmp;
     }
     return (int) x;
 }
 
 /*rnd.c*/