diff options
Diffstat (limited to 'vol2/3.6.lyx')
| -rw-r--r-- | vol2/3.6.lyx | 496 |
1 files changed, 496 insertions, 0 deletions
diff --git a/vol2/3.6.lyx b/vol2/3.6.lyx new file mode 100644 index 0000000..8eaaa14 --- /dev/null +++ b/vol2/3.6.lyx @@ -0,0 +1,496 @@ +#LyX 2.4 created this file. For more info see https://www.lyx.org/ +\lyxformat 620 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass book +\begin_preamble +\input defs +\end_preamble +\use_default_options true +\maintain_unincluded_children no +\language english +\language_package default +\inputencoding utf8 +\fontencoding auto +\font_roman "default" "default" +\font_sans "default" "default" +\font_typewriter "default" "default" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts false +\font_sc false +\font_roman_osf false +\font_sans_osf false +\font_typewriter_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures true +\graphics default +\default_output_format default +\output_sync 0 +\bibtex_command default +\index_command default +\float_placement class +\float_alignment class +\paperfontsize default +\spacing single +\use_hyperref false +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_formatted_ref 0 +\use_minted 0 +\use_lineno 0 +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 +\papercolumns 1 +\papersides 1 +\paperpagestyle default +\tablestyle default +\tracking_changes false +\output_changes false +\change_bars false +\postpone_fragile_content false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\docbook_table_output 0 +\docbook_mathml_prefix 1 +\end_header + +\begin_body + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +rexerc2[15] +\end_layout + +\end_inset + +some people have been afraid that computers will someday take over the world; + but they are reassured by the statement that a machine cannot do anything really new, + since it is only obeying the commands of its master, + the programmer. + Lady Lovelace wrote in 1844, + +\begin_inset Quotes eld +\end_inset + +The Analytical Engine has no pretensions to +\emph on +originate +\emph default + anything. + It can do +\emph on +whatever we know how to order it +\emph default + to perform. +\begin_inset Quotes erd +\end_inset + + Her statement has been elaborated further by many philosophers. + Discuss this topic, + with random number generators in mind. +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +answer +\end_layout + +\end_inset + +While it is true that a machine cannot do anything that a programmer doesn't tell it to do, + there are a number of caveats here. + First is that the programmer, + or their boss, + may not have other people's best interests in mind. + Another one is that what the programmer tells the machine to do is not the same thing as what they +\emph on +expects +\emph default + them to do; + the software may have bugs, + although the bugs are unlikely to make the computer take over the world. + Finally, + if a random number generator is being used, + the programmer is telling the machine to do one of a number of actions, + chosen with some given distribution, + without telling it which one to choose. + These actions are typically limited to a given scope, + and the programmer still controls the family of actions that the machine may take. +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +rexerc11[M25] +\end_layout + +\end_inset + +Assuming that floating point arithmetic on numbers of type +\family typewriter +double +\family default + is properly rounded in the sense of Section 4.2.2 (hence exact when the values are suitably restricted), + convert the C routines +\emph on +ran_array +\emph default + and +\emph on +ran_start +\emph default + to similar programs that deliver double-precision random fractions in the range +\begin_inset Formula $[0..1)$ +\end_inset + +, + instead of 30-bit integers. +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +answer +\end_layout + +\end_inset + +Technically this does the work: +\begin_inset listings +lstparams "language=C,numbers=left,basicstyle={\small\sffamily},breaklines=true" +inline false +status open + +\begin_layout Plain Layout + +#include <math.h> +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +static double ran_u[KK]; +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +void ranf_array(double out[], + size_t n) +\end_layout + +\begin_layout Plain Layout + +{ +\end_layout + +\begin_layout Plain Layout + + size_t i, + j; +\end_layout + +\begin_layout Plain Layout + + assert(n >= KK); +\end_layout + +\begin_layout Plain Layout + + for (j = 0; + j < KK; + j++) +\end_layout + +\begin_layout Plain Layout + + out[j] = ran_u[j]; +\end_layout + +\begin_layout Plain Layout + + for (; + j < n; + j++) +\end_layout + +\begin_layout Plain Layout + + out[j] = fmod(1. + + out[j-KK] - out[j-LL], + 1.); +\end_layout + +\begin_layout Plain Layout + + for (i = 0; + i < LL; + i++, + j++) +\end_layout + +\begin_layout Plain Layout + + ran_u[i] = fmod(1. + + out[j-KK] - out[j-LL], + 1.); +\end_layout + +\begin_layout Plain Layout + + for (; + i < KK; + i++, + j++) +\end_layout + +\begin_layout Plain Layout + + ran_u[i] = fmod(1. + + out[j-KK] - ran_x[j-LL], + 1.); +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +void ranf_start(long seed) +\end_layout + +\begin_layout Plain Layout + +{ +\end_layout + +\begin_layout Plain Layout + + ranf_start(seed); +\end_layout + +\begin_layout Plain Layout + + for (size_t i = 0; + i < KK; + i++) +\end_layout + +\begin_layout Plain Layout + + ran_u[i] = (double)ran_x[i] / MM; +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +rexerc12[M21] +\end_layout + +\end_inset + +What random number generator would be suitable for a minicomputer that does arithmetic only on integers in the range +\begin_inset Formula $[-32768..32767]$ +\end_inset + +? +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +answer +\end_layout + +\end_inset + +We could use one of the generators with very large moduli from exercise 3.2.1.1–14. + We could also use running generators like the one in the text +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +rexerc15[25] +\end_layout + +\end_inset + +Write C code that makes it convenient to generate the random integers obtained from +\emph on +ran_array +\emph default + by discarding all but the first 100 of every 1009 elements, + as recommended in the text. +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +answer +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset listings +lstparams "language=C,numbers=left,basicstyle={\normalsize\sffamily},breaklines=true" +inline false +status open + +\begin_layout Plain Layout + +long next() +\end_layout + +\begin_layout Plain Layout + +{ +\end_layout + +\begin_layout Plain Layout + + static long buf[1009], + next = 100; +\end_layout + +\begin_layout Plain Layout + + if (next == 100) { +\end_layout + +\begin_layout Plain Layout + + ran_array(buf, + sizeof(buf) / sizeof(buf[0])); +\end_layout + +\begin_layout Plain Layout + + next = 0; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + return buf[next++]; +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\end_body +\end_document |
