@Dave I never even thought of a non-integer number of puffs. You've stumbled on something that shouldn't work, but does. Obviously Qrrbrbirlbel provides the proper solution. But for fans of impenetrable hacking, here's something that also shouldn't work, but does:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.symbols}
\usepgflibrary{intersections}
\begin{document}
\makeatletter
% Save the original background path definition.
\let\pgf@sh@bg@cloud@original=\pgf@sh@bg@cloud
% Redefine the cloud background path.
\def\pgf@sh@bg@cloud{%
% Draw the original path.
\pgf@sh@bg@cloud@original%
% Now save it globally.
\pgfgetpath\tmp@path%
% NB this will NOT work with early PGF versions as this
% relies on \pgf@node@name
\expandafter\global\expandafter%
\let\csname pgf@sh@bg@path@saved@\pgf@node@name\endcsname=\tmp@path%
}
% Now redefine the cloud anchor border.
% NB Outer sep is NOT taken into account.
\def\pgf@anchor@cloud@border#1{%
\pgfextract@process\externalpoint{#1}%
%
\pgfintersectionofpaths{%
% Set the transform of the current referenced node.
\pgfsettransform{\csname pgf@sh@nt@\pgfreferencednodename\endcsname}%
% Draw a line from the center of the cloud to the the external point.
\pgfpathmoveto{\centerpoint}%
\pgfpathlineto{\pgfpointadd{\centerpoint}{\externalpoint}}%
}%
{%
% Install the saved cloud path.
\expandafter\pgfsetpath%
\csname pgf@sh@bg@path@saved@\pgfreferencednodename\endcsname%
}%
\ifnum\pgfintersectionsolutions>0\relax%
\pgf@process{%
% Transform the intersection appropriately.
\pgfpointintersectionsolution{1}%
\pgf@pos@transform{\pgf@x}{\pgf@y}%
}
\else%
\centerpoint%
\fi
}
\begin{tikzpicture}
\node [cloud, cloud puffs=15.7, minimum width=3cm, draw]
(cloud) at (0,0) {Cloud};
\foreach \i in {0, 10, ..., 360}
\draw [black, ->] (cloud) -- (\i:5cm and 3cm);
\end{tikzpicture}
\end{document}

Note, that it doesn't take into account the outer sep and is likely not to be particularly robust, nor will it work with early versions of PGF. It is also slow.